GIT-Repositories auf dem Webspace via HTTP

In diesem Artikel möchte ich zeigen, wie man sich auf seinem Shared Webspace eigene GIT-Repositories anlegen kann und diese über HTTP/HTTPS klonen kann und auch über HTTP/HTTPS wieder die Änderungen zurück auf den Server überträgt. So kann man ein von überall zugängliches Repository einrichten, ohne SSH zu benötigen.

In meinem Fall ist git auf dem Shared Host, auf dem mein Webspace liegt, zum Glück schon verfügbar (all-inkl.com sei Dank 🙂 ). (Es gibt aber auch Anleitungen, in denen beschrieben wird, wie man sich selbst Git zur Nutzung auf einem Shared Host kompiliert.)

Folgendes wollen wir machen:

  • Basisverzeichnis wird ein Ordner namens repo direkt unterhalb des Document-Root meiner (Sub-)Domain sein.
  • Darin werden alle Repositories liegen, und außerdem
  • ein weiteres Unterverzeichnis cgi-bin mit CGI-Scripten zum Initialisieren neuer Repositories und einem Wrapper-Script, um über HTTP pushen und pullen zu können.
  • … und das ganze wird mit HTTP Basic Auth (Passwortschutz via .htaccess) abgesichert.

Zunächst legen wir uns also im Document Root unserer (Sub-)Domain ein Verzeichnis namens repo an, und wir versehen es mit einem Passwortschutz via .htaccess und htpasswd. In der Regel geht das über das Administrationssystem des Shared-Hosting-Providers.

Danach müsste sich im Verzeichnis repo nun eine .htaccess Datei befinden, die wir um diese 2 Zeilen erweitern:

Damit erreichen wir, dass alle Dateien, deren Name mit .cgi endet, als CGI-Script erkannt und ausgeführt werden.

Prüfung der git-Verfügbarkeit

Wir legen in repo ein Script namens config.cgi mit folgendem Inhalt an, und machen es ausführbar:

Das führen wir aus, um herauszufinden, ob und in welcher Version git verfügbar ist. Beim Aufruf des Scriptes müssen wir das zuvor für den Verzeichnisschutz festgelegte Passwort eingeben. Dann erfahren wir den absoluten Pfad und die Position und Version des git-Programms:

Wenn Ausgaben fehlen, liegt das git-Binary möglicherweise nicht im Pfad, oder es ist gar nicht installiert. Hier hilft nur ausprobieren. Nachdem git geortet wurde, kann das config.cgi wieder gelöscht werden.

Ein CGI-Script zum Initialisieren von GIT-Repositories

Hier seht ihr ein Beispiel, wie man mittels CGI-Script ein sogenanntes „bare“-Repository auf seinem Webspace initialisieren kann. So kann nicht auf einen SSH-Zugang zu seinem Webspace angewiesen. Das Script heißt z.B. init.cgi und wird unter repo/cgi-bin/ abgelegt:

In dem Script sind der Pfad zu den Repositories und zum GIT-Programm fest codiert (DOCUMENT_ROOT/repo). Diese müssen ggf. im Script angepasst werden.

Das Script wird ausführbar gemacht, anschließend kann der Name des neu zu initialisierenden Projekts z.B. per Query-String beim Aufruf übergeben werden:

Aufruf im Browser: http://sub.example.com/repo/cgi-bin/init.cgi?projekt=eintest, und wir erhalten eine Ausgabe ähnlich der folgenden:

Repo-Initialisierung

git version 1.7.0.4

Lege Projektverzeichnis an…

Initialisiere Repository…

Das Repository eintest ist nun verfügbar.

Sofern wir die repo/.htaccess um die Zeile Options +Indexes erweitern, funktioniert der Link im Browser sogar. Das ist aber nicht für die Funktion nötig, Wir können das Repository auch so schon klonen:

Klonen unseres ersten Projekts

Unser neu angelegtes Projekt können wir nun lokal auf irgendeinem Rechner klonen:

Pushen geht aber noch nicht. Dazu müssen wir erst ein CGI-Script auf dem Server anlegen, welches mit dem HTTP-Backend von GIT kommuniziert.

„git push“ via HTTP: Ein CGI-Wrapper für das Git-HTTP-Backend

Unterhalb von repo/cgi-bin/ legen wir ein Script namens git.cgi mit dem folgenden Inhalt an:

Falls nötig, wird der Pfad zum Git-Programm angepasst. Nun sollten wir über den Umweg dieses CGI-Scripts unser Repository klonen können und auch Änderungen zurück auf den Server pushen:

Inhaltlich geht jetzt also alles, nun wird noch alles schön gemacht. Falls es Probleme gibt, so werden z.B. in dem Tutorial auf http://www-verimag.imag.fr/~moy/?Host-a-Git-repository-over-HTTP-S ein paar Möglichkeiten vorgestellt, wie man den Fehler und eine Lösung finden kann.

Aufhübschen

Weil ich gern schöne kurze URLs mag, habe ich folgende RewriteRules in die repo/.htaccess ergänzt:

Die erste Regel sorgt dafür, dass beim Aufruf der URL http://sub.example.com/repo/init das CGI-Script init.cgi aufgerufen wird. So können wir neue Repos anlegen mit http://sub.example.com/repo/init?projekt=blabla.

Die zweite Regel sorgt dafür, dass wir direkt die kurzen Repository-URLs beim Klonen und Pushen angeben können, und trotzdem der interne CGI-Wrapper für das Git-HTTP-Backend verwendet wird. Somit ist nun sowohl

als auch

möglich.

Statt des langen komplizierten Such-Patterns in der 2. Regel hätte man sicher auch einfach ^(.*)$ verwenden können (solltet ihr im Fehlerfall auch probieren). Aber so können wir später zusätzlich noch gitweb installieren, sodass wir beim direkten Aufruf von http://sub.example.com/repo/ im Browser eine hübsche Web-GUI mit Zugriff auf alle unsere Repositories erhalten.

Wie das geht, zeige ich demnächst vielleicht mal in einem anderen Beitrag 🙂

Nachdem nun Push und Pull via http://<user:pw>@sub.example.com/repo/<reponame> möglich ist, können wir das CGI-Script /repo/cgi-bin/git.cgi dahingehend anpassen, dass der direkte Zugriff auf das CGI nun nicht mehr zugelassen wird. Dazu wird der hervorgehobene if-Block ergänzt:

Quellen:

Veröffentlicht von

Steffi

Hi! Ich bin beruflich v.a. im Linux-Umfeld tätig. In meiner Freizeit nähe und koche ich gern - außerdem studiere ich nebenher Mathematik und mache viel Sport. Über all diese Dinge, und was mich sonst noch beschäftigt, schreibe ich hier in meinem Blog.

3 Gedanken zu „GIT-Repositories auf dem Webspace via HTTP“

  1. Super Anleitung, funktioniert perfekt.

    Ein kleiner Fehler ist dennoch da – „init.cgi“ Zeile 58:
    print "</pre">;
    muss
    print "</pre>";
    heißen.

  2. Hey, es freut mich sehr, dass Dir die Anleitung gefällt. Ich freue mich immer über Rückmeldungen. Danke auch für deinen Tipp, ich hab den Fehler korrigiert 🙂

    Liebe Grüße,
    Steffi

  3. Hi, gute Anleitung  funktioniert nicht bei all-inkl.com
    Verboten
    Sie haben keine Erlaubnis, /repo/cgi-bin/init.cgi auf diesem Server zuzugreifen.

Kommentare sind geschlossen.