migration example

This shows what a typical migration would look like, using a test setup.

existing setup

The existing gitolite is the latest in the "g2" (v2.x) branch.

First, the rc file has the following lines different from the default:

-$GL_WILDREPOS = 0;
+$GL_WILDREPOS = 1;

-$GL_GITCONFIG_KEYS = "";
+$GL_GITCONFIG_KEYS = ".*";

Next, the conf/gitolite.conf file in ~/.gitolite:

repo    gitolite-admin
        RW+             =   tester u1

repo    testing
        RW+     =   @all

repo foo
        RW+             =   u1 u2
        RW+ NAME/       =   u1
        RW+ NAME/u2     =   u2

repo bar
        RW  =   u2

repo baz/..*
        C   =   u3 u4
        RW+         =   CREATOR
        config foo.bar = baz

(Note that this conf file has NAME/ rules, which have changed significantly in v3; see [here][g2i-name] for details).

These are the repos already existing

$ find repositories -name "*.git" | sort
repositories/bar.git
repositories/baz/u3.git
repositories/baz/u4.git
repositories/baz/uthree.git
repositories/foo.git
repositories/gitolite-admin.git
repositories/testing.git

The config entries exist for all the baz/ repos:

$ grep -2 foo `find repositories -name "config" `
repositories/baz/uthree.git/config-[gitweb]
repositories/baz/uthree.git/config- owner = u3
repositories/baz/uthree.git/config:[foo]
repositories/baz/uthree.git/config- bar = baz
--
repositories/baz/u4.git/config-[gitweb]
repositories/baz/u4.git/config-     owner = u4
repositories/baz/u4.git/config:[foo]
repositories/baz/u4.git/config-     bar = baz
--
repositories/baz/u3.git/config-[gitweb]
repositories/baz/u3.git/config-     owner = u3
repositories/baz/u3.git/config:[foo]
repositories/baz/u3.git/config-     bar = baz

preparing for the migration

getting v3

Fortunately this is easy here; I just happened to have the repo already fetched so I just had to switch branches. You may have to 'git clone ...' from github.

$ cd gitolite
$ git checkout master
Branch master set up to track remote branch master from origin.
Switched to a new branch 'master'

run check-g2-compat

This is a quick and dirty program to catch some of the big issues.

$ cd
$ gitolite/check-g2-compat
INFO        This program only checks for uses that make the new v3 completely unusable
            or that might end up giving *more* access to someone if migrated as-is.
            It does NOT attempt to catch all the differences described in the docs.

INFO        'see docs' usually means the pre-migration checklist in
            "g2migr.html"; to get there, start from the main migration
            page at https://sitaramc.github.com/gitolite/migr/

checking rc file...
NOTE        GL_ADMINDIR is in the right place; assuming you did not mess with
            GL_CONF, GL_LOGT, GL_KEYDIR, and GL_CONF_COMPILED

checking conf file(s)...
SEVERE      NAME rules; see docs

checking repos...
WARNING     found 3 gl-creater files; see docs

...all done...

the actual migration

Here's the actual migration, step by step

step 1

$ ls -a bin
.                gl-admin-push    gl-install       gl-setup-authkeys  gl-VREF-DUPKEYS
..               gl-auth-command  gl-mirror-push   gl-system-install  gl-VREF-EMAIL_CHECK
gitolite_env.pm  gl-compile-conf  gl-mirror-shell  gl-time            gl-VREF-FILETYPE
gitolite.pm      gl-conf-convert  gl-query-rc      gl-tool            gl-VREF-MERGE_CHECK
gitolite_rc.pm   gl-dryrun        gl-setup         gl-VREF-COUNT      sshkeys-lint
$ rm -rf bin;mkdir bin

$ grep GL_PACKAGE .gitolite.rc
$GL_PACKAGE_CONF = "/home/git/share/gitolite/conf";
$GL_PACKAGE_HOOKS = "/home/git/share/gitolite/hooks";
$ rm -rf share

$GL_PACKAGE_HOOKS = "/home/git/share/gitolite/hooks";
$ rm -rf share

$ mv .gitolite.rc old.grc

(still on step 1, this is substep 3) notice we are cloning on the server, using a full path to the repo.

$ git clone repositories/gitolite-admin.git old.ga
Cloning into 'old.ga'...
done.
$ rm -rf repositories/gitolite-admin.git/

Since I'm not interested in preserving the logs and don't have any custom hooks:

$ rm -rf .gitolite

step 2

I have no variables that must be preset, since the report by check-g2-compat is clear.

step 3

Here we install the new gitolite. Remember we already got the new software (in order to run 'check-g2-compat').

Just check that bin is empty, then run 'install -ln' from the gitolite source tree:

$ ls -al bin
total 8
drwxrwxr-x 2 git git 4096 Apr 24 10:57 .
drwx------ 8 git git 4096 Apr 24 10:59 ..
$ gitolite/install -ln
$ ls -al bin
total 8
drwxrwxr-x 2 git git 4096 Apr 24 11:01 .
drwx------ 8 git git 4096 Apr 24 10:59 ..
lrwxrwxrwx 1 git git   30 Apr 24 11:01 gitolite -> /home/git/gitolite/src/gitolite

OK that went well. Now setup gitolite. You don't need a key here; just use a random name:

$ gitolite setup -a admin
Initialized empty Git repository in /home/git/repositories/gitolite-admin.git/

step 4

Now go to your old clone, and push it:

$ cd old.ga
$ gitolite push -f
    ...usual git progress output deleted...
remote: FATAL: git config foo.bar not allowed
remote: check GIT_CONFIG_KEYS in the rc file
To /home/git/repositories/gitolite-admin.git
 + 7eb8163...1474770 master -> master (forced update)

Aaha! I forgot to set GIT_CONFIG_KEYS (new name for GL_GITCONFIG_KEYS) in the new rc file so fix that:

$ vim ~/.gitolite.rc
(edit and set it to `.*` for now)

and push again:

$ gitolite push -f
Everything up-to-date

Damn. We have to make a dummy commit to allow the push to do something.

But wait! We forgot fix the [NAME/][g2i-name] rules, so may as well fix those, add, and push:

$ vim conf/gitolite.conf
# change all NAME/ to VREF/NAME/
# append a '- VREF/NAME/ = @all' at the end
# save
git add conf

$ git commit -m name-rules
    ... some output for add...

$ gitolite push -f
Counting objects: 1, done.
Writing objects: 100% (1/1), 181 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (1/1), done.
To /home/git/repositories/gitolite-admin.git
   1474770..4c2b41d  master -> master

step 5

The only thing left is to fix up the gl-creater files:

$ cd $HOME/repositories
$ find . -type d -name "*.git" -prune | while read r
> do
>     mv $r/gl-creater $r/gl-creator
> done 2>/dev/null

And we're done!

checking things out

Let's see what repos u3 has:

# as user 'u3'
ssh git@server info
hello u3, this is git@server running gitolite3 v3.0-11-g090b0f5 on git 1.7.7.6

     C      baz/..*
 R W        baz/u3
 R W        baz/uthree
 R W        gitolite-admin
 R W        testing

That's a combination of 'info' and 'expand', by the way. There is no expand command any more.

How about adding a new repo and checking if the config entries made it?

# as user u4
$ git ls-remote git@server:baz/ufour
Initialized empty Git repository in /home/git/repositories/baz/ufour.git/
$ grep -A1 foo `find repositories -name "config" `
repositories/baz/u3.git/config:[foo]
repositories/baz/u3.git/config- bar = baz
--
repositories/baz/u4.git/config:[foo]
repositories/baz/u4.git/config- bar = baz
--
repositories/baz/ufour.git/config:[foo]
repositories/baz/ufour.git/config-      bar = baz
--
repositories/baz/uthree.git/config:[foo]
repositories/baz/uthree.git/config-     bar = baz

And there it is, in the second block of lines...

And now we're really done.