Git/Creating new repositories

< Git

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.

Previously PHP libraries were created as top-level repositories, but now should be created under the mediawiki/libs/* namespace per T125031.

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

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

  1. Main drawback is inability to set the Owner, which can leave you locked out of your own brand new repository