"The thing that is in Room 101 is the worst thing in the world." - O'Brien in 1984
Git-Server mit gitosis

Sobald mehrere Leute an einem Dokument arbeiten wollen oder man eine Dokumentenhistory braucht, ist eine Versionsverwaltung Gold wert. In der Vergangenheit war ich immer auf das Wohlwollen eines Freundes angewiesen um Zugriff auf einen SVN-Server zu bekommen. Da ich mittlerweile einen eigenen vServer habe, will ich die Gelegenheit nutzen und auf git umsteigen. Da git eigentlich auf eine verteilte Struktur aufsetzt, ist ein eigenständiger Server nicht unbedingt nötig, erleichtert aber den Datenaustausch bei mehreren Nutzern. Um nicht für jeden Git-Nutzer einen vollwertigen Systemaccount anlegen zu müssen, kommt zusätzlich gitosis zum Einsatz.

Server konfigurieren

Auf Serverseite benötigen wir zu git-core noch gitosis. Was wir durch

sudo aptitude install git-core gitosis
schnell erledigt haben. Dabei werden zusätzlich noch folgende Pakete mitinstalliert
libcurl3-gnutls libdigest-sha1-perl liberror-perl patch python-central
python-pkg-resources python-setuptools python-support rsync
Da eine Anmeldung mittels Passwort unerwünscht ist, brauchen wir zur Anmeldung ein öffentliches Zertifikat. Je nachdem unter welchem Account (Rechner) man später gitosis administrieren will, wählt man die id_rsa.pub aus. Diese findet man in ~/.ssh. Sollte dies nicht der Fall sein, kann einfach mittels
ssh-keygen -t rsa
ein Schlüsselpaar erzeugt werden. Die Initialisierung des Administrationsrepository erfolgt dann mittels
sudo -H -u gitosis gitosis-init < id_rsa.pub
, was uns auch bestätigt wird
Initialized empty Git repository in /srv/gitosis/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /srv/gitosis/repositories/gitosis-admin.git/
Das Administrationsrepository gitosis-admin lässt sich nun einfach klonen mittels
git clone gitosis@example.com:gitosis-admin.git
Sollte der Zugriff per ssh nur bestimmten Nutzern erlaubt sein (was sich z.B. durch eine Passwortabfrage bemerkbar macht), muss die /etc/ssh/sshd_config entsprechend um den Nutzer gitosis erweitert werden, also bspw.
AllowUsers user gitosis
Nach einem Neustart des SSH-Servers durch sudo invoke-rc.d ssh restart sollte der Zugriff auf gitosis-admin gelingen.

Repository anlegen

Um ein neues Repository anzulegen, editiert man die gitsois.conf im Administrationsrepository und erweitert sie um folgenden Block.

[group project-team]
members = user1 user2
writable = project
Damit hat man das Repository project für die Nutzer user1 und user2 angelegt. Damit diese auch tatsächlich Zugriff erhalten, müssen deren öffentliche Schlüssel im Ordner keydir liegen. In unserem Fall sind dies die Dateien user1.pub und user2.pub. Anschließend die Änderungen mittels
git commit -a -m "Repo project fuer user1 und user2 erstellt"
git push
auf den Server übertragen und der administrative Teil ist erledigt.

user1 oder user2 hat nun die Möglichkeit das Repository zu initialisieren und hochzuladen, was wie folgt aussehen kann:

mkdir project
cd project
git init
git remote add origin gitosis@example:project.git
git config branch.master.remote 'origin'
git config branch.master.merge 'refs/heads/master'
echo "Kurze Projektbeschreibung" > .git/description

# Dateien editieren, committen ...

git push origin master:refs/heads/master

Nutzer hinzufügen

Um einen Nutzer hinzuzufügen wird dessen öffentlicher Schlüssel benötigt. Für Benutzer hans auf Maschine host wird bspw. die id_rsa.pub in hans@host.pub umbenannt, nach <code>gitosis-admin/keydir kopiert und dem Repository hinzugefügt. In Kurzform

mv id_rsa.pub gitosis-admin/keydir/hans@host.pub
git add gitosis-admin/keydir/hans@host.pub
Nun muss noch die gitosis.conf entsprechend angepasst werden. Angenommen hans möchte am Projekt project mitarbeiten, sieht das dann in etwa so aus
[group project-team]
members = user hans@host
writable = project
Nach einer Übertragung mittels
git commit -a -m "Nutzer hans hinzugefuegt"
git push
kann hans das Repository mittels
git clone gitosis@example.com:project.git
auschecken.

Client konfigurieren

Auf Clientseite bleibt eigentlich nur die Installation von git-core. Damit beim Commit der korrekte Name und die Mailadresse angezeigt wird, sollt man

git config --global user.name 'Hans Mustermann'
git config --global user.email 'hans@example.com'
ausführen. Weiterhin empfiehlt sich noch das Ändern weiterer Variablen um sich die Arbeit etwas schöner zu machen:
git config --global color.diff auto
git config --global color.branch auto
git config --global color.interactive auto
git config --global color.status auto
git config --global core.editor vim
git config --global merge.tool vimdiff

Links