Git/Creating new repositories
This guide is only for those with administrative access to Gerrit in the Release Engineering Team etc.. If you are a developer who wants a new repository ("Gerrit project"), you want to visit Gerrit/New repositories instead. If you are looking to migrate an existing extension from Subversion to Git, you are looking for this queue. |
This is designed to be a quick and dirty tutorial about how to create a new Git repository hosted by the Wikimedia Foundation. The tool being used as of June 2012 is Gerrit and you will need to be one of the people who are allowed to create new repositories.
Step 0: Read and understand Gerrit docs
Before attempting to create repositories, there are two sections of the Gerrit documentation that you definitely need to read and be familiar with :
- Gerrit access controls
- You almost always will be setting permissions after creating a new repository, so it's important to understand what each of the permissions means and how to use them
- create-project command
- You will be creating the repository via the command line, so make sure you've read and understand the various options available via the command line (especially the
--parent
and--owner
switches!).
Step 1: Pick your repository name
Before you begin, make sure you have decided on a repository name that you do not want to change. Renaming repositories is near impossible (as of Gerrit v2.4) so you need to make sure you are happy with your repository name before you create it. Try to keep the name short, yet meaningful. Please note name must be made of either latin letters (a-z), roman numbers (0-9) or dashes ( - ).
Step 2: Pick your repository's home
For organisation (and permission) purposes, we use top-level project names (like mediawiki/* or operations/*) to put repositories in. It's best to not create new top-level repositories without discussing it first, so the top-levels can be named and setup in a way that is useful and descriptive.
As an example, mediawiki/extensions/VisualEditor
where mediawiki/extensions
is the prefix used for any MediaWiki extension.
If you are unsure, ask around, for example on wikitech-l.
Step 3: Create the repository
Even though there's a way to create new repositories via the Gerrit web interface, please don't use that GUI.
There's a couple of shortcomings[1], so please create the new repository via the command line.
Let's say we were making a new repository called test/my-new-repo
, so the command would be as follows:
ssh -p 29418 gerrit.wikimedia.org gerrit create-project --require-change-id --owner=MyGroup --parent=test --description='"My super awesome repository"' test/my-new-repo
--parent and --owner are mandatory and values should be carefully chosen. If you forget them, do a mistake, the repository has a good percentage of chances of being unusable without admin intervention. |
Important Caveats
Setting the --parent
switch is very important so you inherit the permissions from the containing repository.
If you do not specify the parent, the parent defaults to All-Projects
, which is nearly useless for most repositories.
The parent can be adjusted via a Gerrit admin if you get it wrong, however.
Setting the --owner
switch is even more important because if you do not set the owner of a repository to a group you are a member of (or that the intended user is a member of), you (or they) will be unable to adjust the permissions on your newly created repository (and you'll have to ask a Gerrit admin to fix that).
Step 4: Set permissions
In some cases, you may want to adjust permissions beyond what is inherited from the parent repository. Once the repo is created (and you are an Owner), you can then adjust the permissions via the Gerrit web UI. You will want to use the Gerrit documentation about access rights.
When done changing initial permissions, be sure to remove the "Project and Group Creators" group from the Owner permission, as they do not need it after rights are initially configured.
Step 5: Create .gitreview
file
Once you've made your new repo, please be sure to add a .gitreview
file in the root of the new repository.
This is especially important for extensions, as failure to do so will break Translatewiki.
A .gitreview
file should look like:
[gerrit]
host=gerrit.wikimedia.org
port=29418
project=foo/bar.git
defaultbranch=master
defaultrebase=0
track=1
The host and port should never need to be changed. "project" should be changed to match the repository you've just created. "defaultbranch" is the primary branch that you'll be submitting code to - usually this is master. "defaultrebase" disables the implicit rebasing `git review` does before submitting a change. Lots of repos find this behavior annoying, so you'll generally want to include this. It can be safely omitted, though.
Step 6: Register the extension submodule on mediawiki/{extensions,skins}.git
For repositories under mediawiki/extensions/
or mediawiki/skins/
only, please register the repository submodule in the mediawiki/extension.git or mediawiki/skins.git superproject respectively. This is used by various tools and bots for a number of actions such as deploying code to the Beta Cluster, synchronize extension.json/composer.json data or updating library dependencies via LibUp, among others.
Importing from an existing repository
In case you need to import an existing repository, you will need to add the following permissions on refs/*
:
Push
Create Reference
Create Annotated Tag
Create Signed Tag
Forge Author Identity
Forge Committer Identity
Then clone a mirror of the existing repository, and send all the references to gerrit:
$ git clone --mirror <path to existing repository> mirroring $ cd mirroring $ git remote add gerrit ssh://gerrit.wikimedia.org:29418/<gerrit repository name> $ git push --mirror gerrit
There will be an error about refs/meta/config
which holds the Gerrit repository configuration and can not be overwritten.
Notes
- ↑ Main drawback is inability to set the Owner, which can leave you locked out of your own brand new repository