Lokales git-Projekt auf Gitosis-Server übertragen

Gitosis ist ein Werkzeug, was das öffentliche Hosten von git-Projekten erleichtert. Hier wird beschrieben wie man ein – bisher lokal verwaltetes – Git-Projekt zu gitosis hinzufügt, sodaß es übers Web und über das git-Protokoll per ssh verfügbar ist. Es wird dabei davon ausgegange, daß schon eine funktionierende gitosis-Installation existiert.

Die Konfiguration wird bei Gitosis- wie soll es anders sein – selbst in einem Git-Repository verwaltet. Das neue Projekt muß über diesen Weg gitosis bekannt gemacht werden. Dazu fügt man der gitosis.conf folgende Abschnitte hinzu:

[group projektname]
members = ssh-key@hostname ssh-key2@hostname2
writeable = projektname

[repo smtpcheckaddresses]
owner = Vorname Nachname
description = Ein Beschreibungstext, der auch im Web angezeigt wird.

Weiter oben in der Datei steht übrigens

[gitosis]
gitweb = yes
daemon = yes

[repo gitosis-admin]
gitweb = no
daemon = no

Das sorgt dafür, daß neu angelegte Repositories automatisch über das gitweb-CGI-Skript und über den git-Daemon veröffentlich werden, sofern die Dateisystemberechtigungen das hergeben. Eine andere Möglichkeit gitosis mitzuteilen ein Repository nicht zu veröffentlichen ist, die entsprechenden Optionen explizit wieder auszuschalten wie bei gitosis-admin.

In diesem Schritt wird das Repository noch nicht tatsächlich angelegt, das geschieht später, beim ersten Push-Versuch auf dieses. Es bietet sich an, für jedes Projekt gleich von Anfang an eine Gruppe zu vergeben. So kann man später anderen Schreib-Zugriff geben, indem man einfach einen weiteren SSH-Key getrennt mit Leerzeichen zur Gruppe hinzufügt.

Anschließend schreibt ein

$ git commit -a
$ git push

die Konfiguration auf den Server.

Nun kann das Repository initial hochgeladen werden (siehe auch Florians Anleitung):

$ cd ~/projekte/projektname
$ git remote add origin gitosis@servername:projektname.git
$ git push origin master:refs/heads/master

Erhält man beim Pushen eine Fehlermeldung der Art "src refspec master does not match any" bedeutet dies, daß noch kein Commit auf das lokale Repository stattgefunden hat (vor dem initialen Hochladen muß mindestens einmal lokal etwas commited worden sein.).

Leider passt gitosis die Dateisystemberechtigugnen für das Repository-Verzeichnis auf dem Server nicht automatisch an (zumindest in der von mir eingesetzen Version war das nicht der Fall). Deshalb muß man nachhelfen mit einem chmod a+rx ~git/repositories/projektname.git.

Will man auf der Summary-Seite von gitweb neben der description noch einen weiteren einführenden Text zum Projekt unterbringen, legt man auf dem Server im git-Verzeichnis projektname.git eine Datei README.html an. Gitweb wird deren Inhalt (muß valides HTML sein!) dann im Abschnitt "readme" ausgeben.

Das Pullen über HTTP setzt eine entsprechende Aufbereitung der Daten nach jedem Commit auf der Server-Seite vorraus. Die Aufbereitung wird über einen Hook angestoßen. Dazu muß der Hook post-update ausführbar gemacht werden und mindestens einmal (mit Rechten des Gitosis-Users!) aufgerufen werden:

$ su git
$ chmod a+x ~/repositories/projektname.git/hooks/post-update
$ cd ~/repositories/projektname.git/hooks
$ ./post-update

Jetzt sollte das neu angelegte Repository vollständig über gitweb, den git-Daemon und über HTTP-Pull erreichbar sein. Am besten gleich mal testen mit

$ cd ~/tmp
$ mkdir -p gittest/daemon; mkdir gittest/http
$ cd gittest/daemon
$ git init
$ git pull git://git.example.com/projektname.git
$ cd ../http
$ git init
$ git pull http://git.example.com/gitrepos/projektname.git

Erscheint beim HTTP-Pull eine Fehlermeldung der Art "fatal: http://git.example.com/gitrepos/projektname.git/info/refs not found: did you run git update-server-info on the server?", dann wurde der obige post-update-Schritt vergessen.