From Svn to Gitolite

Today I’d like to describe how to migrate from Svn to Git, minding existing infrastructure. One of the most common Subversion servers configurations is Linux server with Apache and mod_dav_svn module serving one or more Subversion repositories. Each Subversion repository may contain one or more projects. Of course, I will use SubGit to make migration smooth, i.e. without a need to force users to make a switch from Subversion to Git overnight.

For Git, I’ve chosen Gitolite as a Git management tool, as it is relatively easy to install and lot of documentation resources.

Background

Here is the first picture. In blue initial configuration is shown and in gray are what we will gradually build in this post. This sample migration takes place on Ubuntu Linux server:

Initial
Setup

Step 1: Install Gitolite and create ‘Git’ user

To install Gitolite I’m using “install as root” method from Gitolite documentation. Few migration-specific additions are marked with the bold font.

On your workstation:

  • copy your ~/.ssh/id_rsa.pub file to /tmp/YourName.pub on the server. (The name of this file determines your gitolite username, so if you leave it as id_rsa.pub, your gitolite username will be id_rsa, which may not be what you want).

On your server, as root:

git clone git://github.com/sitaramc/gitolite gitolite/src/gl-system-install
# defaults to being the same as:
# gitolite/src/gl-system-install /usr/local/bin /var/gitolite/conf /var/gitolite/hooks

To upgrade gitolite, repeat the above commands. Make sure you use the same arguments for the last command each time.

Git user should be in the same group as your Apache user:

useradd git -g www-data -m -s /bin/bash

Switch to the hosting user

su - git

(now as git)

gl-setup /tmp/YourName.pub

When prompted edit the following values in /home/git/.gitolite.rc file:

$REPO_UMASK = 0002; # default is 0077
$GL_GITCONFIG\_KEYS = "core.sharedRepository"; # default is ""

Change repositories directory permissions to let Apache user read it contents:

chmod ug+rx /home/git/repositories

On your workstation:

git clone git@server:gitolite-admin

Gitolite
Installed

Step 2: Create Git repositories with Gitolite

Create empty Git repository for each of your Subversion project. In this post I assume that there are three Subversion projects in a single Subversion repository (p1, p2, p3) each with a standard trunk/branches/tags layout. You may have different distribution as well as different layout.

On your workstation, edit gitolite-admin/conf/gitolite.conf file:

repo    gitolite-admin
        RW+     =   alex
repo    testing
        RW+     =   @all

repo    p1
        RW+     =   alex
        config core.sharedRepository = true
repo    p2
        RW+     =   alex
        config core.sharedRepository = true
repo    p3
        RW+     =   alex
        config core.sharedRepository = true

Add more access rules if necessary, commit and push your change:

git add conf/gitolite.conf
git commit -m "repositories added"
git push

Git Repositories Created

Step 3: Set up smooth Svn to Git migration

On server download and install SubGit. Use either debian package distribution or zip archive.\

sudo dpkg -i subgit_1.0.0-EAP-902_all.deb

Or

unzip subgit_1.0.0-EAP-902.zip

To set up migration, as www-data user, run:\

$ sudo -u www-data subgit configure /var/svn/repos
SubGit version 1.0.0-EAP ('Miai') build #902
This is an EAP build, which you may not like to use in
production environment.

Detecting paths eligible for translation...
Subversion to Git mapping has been configured in '/var/svn/repos':\
  /p1 : /var/svn/repos/git/p1.git
  /p2 : /var/svn/repos/git/p2.git
  /p3 : /var/svn/repos/git/p3.git

CONFIGURATION SUCCESSFUL

Adjust ‘/var/svn/repos/conf/subgit.conf’ file and then run

subgit install "/var/svn/repos"

to complete SubGit installation.

SubGit has detected Subversion projects and created default configuration. Now I will edit SubGit configuration file at /var/svn/repos/conf/subgit.conf to specify our Gitolite repositories locations instead of default ones and to mark repository as shared:

[core]
        # shared option must be set to 'true', 
        # as long as apache and gitolite are ran 
        # by different users (i.e. www-data and git)
        shared = true
        ...
        # authors.txt consists of mapping lines:
        # svnUser=gitUser<gitUser@email.com>
        # this file is optional
        authorsFile = conf/authors.txt
[git "p1"]
        translationRoot = p1
        repository = /home/git/repositories/p1.git
        ....
[git "p2"]
        translationRoot = p2
        repository = /home/git/repositories/p2.git
        ...
[git "p3"]
        translationRoot = p3
        repository = /home/git/repositories/p3.git
        ...

As soon as you’re happy with configuration, enable migration:

$ sudo -u www-data subgit install /var/svn/repos
SubGit version 1.0.0-EAP ('Miai') build #902
...
INSTALLATION SUCCESSFUL
...

That’s all, Gitolite and smooth Svn To Git migration is now configured!

Smooth Svn to Git migration

Commit changes to Subversion and Git users will pull them into their Git clones, push commits to Git repository and Subversion users will receive them. Try it :)

In case you have any questions or suggestions, please feel free to contact me at support@subgit.com Thanks!

Written on January 27, 2012