Gitolite ist ein Programm, mit dem man Git-Repositories für mehrere Benutzer auf einem Server hosten kann. Die einzige Voraussetzung ist ein (einziger) SSH-Account. Ich habe Gitolite selbst im Einsatz und kann mir so für all meine Projekte eigene Repositories anlegen und einzelnen Leuten Zugriff darauf geben (z.B. für Uniprojekte) und bin nicht auf GitHub oder eine andere Plattform angewiesen.

Unter anderem habe ich ein Repository für das Template dieser Website hier. So kann ich Änderungen am Design vornehmen und wenn ich mal etwas kaputtmache, kann ich den alten Stand umgehend wiederherstellen. Jetzt wäre es angenehm, wenn ich das Template nicht nach jeder Änderung selbst neu einspielen müsste, sondern wenn es sich per Git automatisch aktualisieren würde. Hilfreich hierbei ist, dass Gitolite auf dem selben Webspace läuft, wie meine Website.

Hooks

Zu diesem Zweck verwende ich einen Git-Hook. Hooks sind Einstiegspunkte für Programme, die an einer bestimmten Stelle des Git-Workflows automatisch aufgerufen werden. Mehr Informationen zu Hooks gibt es im Git-Buch. Hier werde ich den Hook post-receive verwenden. Dieser wird auf dem Server ausgeführt, nachdem jemand Änderungen mit git push auf den Server geladen hat.

Repo-specific hooks aktivieren

Da ich mein Programm nur für mein Template-Repository ausführen will und nicht für alle anderen, mache ich mir ein Gitolite-Feature namens repo-specific hooks zu Nutzen. Öffne hierzu auf dem Server, auf dem Gitolite installiert ist, die Datei ~/.gitolite.rc und suche nach einem Eintrag, der so ähnlich aussieht, wie dieser hier und entferne gegebenenfalls die Raute vor der zweiten angegebenen Zeile:
~/gitolite.rc
#allow repo-specific hooks to be added
 #'repo-specific hooks',

Bash-Script zur Aktualisierung

In der Gitolite-Konfiguration ist ein Verzeichnis festgelegt, in dem lokale Programme für Gitolite liegen. Um herauszufinden, welches Verzeichnis das in deinem Fall ist, suche in der Datei gitolite.rc nach dieser Stelle:
~/gitolite.rc
LOCAL_CODE  =>  "$ENV{HOME}/local",
In diesem Fall ist das betreffende Verzeichnis der Ordner local im eigenen Home-Verzeichnis.

Zunächst brauche ich ein Programm, das über den post-receive-Hook ausgeführt wird. Da ich nur einen Befehl ausführen muss, reicht mir ein einfaches Bash-Script. Ich lege im Ordner local/hooks/repo-specific (Ordner ggf. anlegen) eine Datei namens template-deploy mit folgendem Inhalt an:

local/hooks/repo-specific/template-deploy
#! /bin/bash
GIT_WORK_TREE=/path/to/my/template git checkout -f master > /dev/null 2>&1 &

/path/to/my/template muss durch den Pfad ersetzt werden, in den die Dateien ausgeliefert werden sollen. In meinem Fall wäre es das Templateverzeichnis meiner Website. Der Befehl kopiert alle Dateien des master-Branches in das angegebene Verzeichnis. Der hintere Teil dient nur dazu, alle Ausgaben zu unterdrücken.

Dadurch, dass mir das Script nur den master-Branch kopiert, kann ich experimentelle Änderungen, die nicht gleich auf der Produktivseite erscheinen sollen, auf anderen Branches durchführen und in den master mergen, sobald sie fertig sind. Ich könnte mir auch verschiedene Verzeichnisse anlegen, die alle unterschiedliche Branches verwenden, um mehrere Branches gleichzeitig testen zu können.

Script für Hook registrieren

Im letzten Schritt bleibt jetzt noch, festzulegen, dass das Script mit dem post-receive-Hook ausgeführt werden soll. Hierzu bearbeitet man die Datei conf/gitolite.conf im gitolite-admin-Repository. Das ist die Datei, in der die einzelnen Repositories konfiguriert werden. Hier fügt man folgende Zeile in der Konfiguration des betreffenden Repository's ein:

conf/gitolite.conf
repo template
  [...]
  option hook.post-receive = template-deploy

Das war's auch schon. Jedes Mal, wenn ich jetzt eine Änderung in meinem Repository pushe, wird das Template auf meiner Seite automatisch mit dem master-Branch aktualisiert.

Quellen