At work we recently switched from subversion to Git for our version control. I wont go into it too much, but the main reasons where:

  • We wanted a distributed system, for the flexibility it offers individuals
  • We wanted the enhanced branch/merge
  • Just for fun really, broaden our horizons

Anyway, I love GitHub, but it's not the answer to everything! I wanted a central repository that I could control, so having had a brief glimpse at Gitorious and gitosis, I settled on gitolite. Now, I'm usually quite a lazy sys admin, and unless I desperately need a feature in the latest version of an application, I'm usually happy to fall back on the my chosen package manager, in this case Ubuntu's APT. Gitolite got a package as of version 10.10 Maverick Meerkat, so I told our local Ubuntu mirror to download all the 10.10 packages and after that, upgraded the server I had in mind so that I could use the gitolite package.

Install Gitolite

Nice and easy this part, on the server:

server> sudo apt-get update
server> sudo apt-get install gitolite

Creating a Public/Private key pair

If you already have one, send the public halve over to the server and skip this part. Otherwise, take a look at ssh key based authentication, then create your key pair on your client machine:

client> ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/davem/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/davem/.ssh/id_rsa.
Your public key has been saved in /home/davem/.ssh/
The key fingerprint is:
61:bf:f5:2d:f6:ed:cd:10:b7:0c:be:5d:4d:8f:a3:0d davem@client
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|        o        |
|       . o       |
|        S . ... o|
|           o..o*+|
|          . E.Bo=|
|             =o*+|
|            ...o*|

Once created, send the public halve to the gitolite server. Be sure to use the name you provided when creating the key. In this example, I've called the key on the target machine, so I can differentiate between myself and other developers.

client> scp ~/.ssh/

Configure gitolite

On the server, copy the public halve to a convenient location and run the gl-setup tool.

server> mv /tmp/
server> chmod 666 /tmp/
server> sudo su gitolite
server> gl-setup /tmp/

That's gitolite setup, we now need to go back to the client machine to fully configure it. First edit your .ssh/config file, so that ssh knows how to connect to the server. Again, be careful to use the correct name for your key pair:

Host servername
IdentityFile ~/.ssh/id_rsa

Now we can clone the git repository that is used to configure gitolite:

client> git clone gitolite@server:gitolite-admin
Initialized empty Git repository in /home/davem/gitolite-admin/.git/
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (6/6), done.
client> cd gitolite-admin

Adding repositories

The gitolite admin contains two folders. The first, conf contains a single config file. Open that and create a new repository by adding:

        repo    mytest
                  RW+     =   @all

You then need to commit the changes and push them to the gitolite server:

client> git commit -m "Added mytest repo" conf/gitolite.conf
client> git push

We then should be able to clone our new repository:

client> git clone gitolite@server:mytest

Adding users

To add a new user, simply add their public key halve to your clone of the gitolite-admin repo, add, commit and push.

client> cd gitolite-admin
client> cp ~/Downloads/ keydir/
client> git add keydir/
client> git commit -m "Added another as a user" keydir/
client> git push

I wont go any further than that, you can configure fine grain access control and other things in the conf/gitolite.conf file, check out the documentation. Hope it's been helpful, comments (especially corrections) are appreciated.