x

Einloggen

Hast du noch keinen Account? Jetzt registrieren!

So verwaltest du eine Webseite mit Git

Git für Websites
Die HTML-Quelle für meine Webseite befindet sich in einem Git-Repository auf meinem lokalen Computer. Dieser Artikel beschreibt, welche Einstellungen ich vorgenommen habe, so dass ich Änderungen einfach mit "Git Push Web" einarbeiten kann.

Einzeilige Zusammenfassung: via push in ein Remote-Repository hochladen und ein post-receive Hook mit "git checkout -f".

Nun etwas ausführlicher....
Das lokale Repository
Es ist eigentlich egal, wie das lokale Repository eingerichtet wurde, aber der Argumente willen, nehme ich hier mal an, dass du bei null anfängst.

$ mkdir website && cd website
$ git init
Legt leeres Git Repository in /home/ams/website/.git/ an
$ echo 'Hallo Welt!' > index.html
$ git add index.html
$ git commit -q -m "Die bescheidenen Anfänge meiner Webseite."

Egal wie, du besitzt ein Repository, dessen Inhalte du in eine Webseite umwandeln möchtest.

Das Remote-Repository
Ich nehme an, dass die Webseite auf einem Server gespeichert sein wird, auf den du mit SSH zugreifst und das du für den SSH-Zugriff kein Passwort eingeben musst (z.B. dass sich dein öffentlicher Schlüssel in ~/.ssh/authorized_keys befindet und du den SSH-Agenten lokal ausführst).

Erstelle auf dem Server ein neues Repository, um das lokale zu spiegeln.
$ mkdir website.git && cd website.git
$ git init --bare
Legt ein leeres Git-Repository in /home/ams/website.git/ an

Danach definierst (und aktivierst) du einen post-receive Hook, der den letzten Baum im DocumentRoot des Webservers abmeldet (dieses Verzeichnis muss vorhanden sein, Git wird es nicht für dich anlegen):
$ mkdir /var/www/www.example.org
$ cat > hooks/post-receive
#!/bin/sh
GIT_WORK_TREE=/var/www/www.example.org git checkout -f
$ chmod +x hooks/post-receive

Hinweis

Zurück am Arbeitsplatz musst du eine Bezeichnung für die Remote-Version definieren und dann dorthin spiegeln, womit dort ein neuer "Master"-Ast angelegt wird.

$ git remote add web ssh://server.example.org/home/ams/website.git
$ git push web +master:refs/heads/master

Auf dem Server sollte /var/www/www.example.org nun eine Kopie deiner Dateien enthalten und dies unabhängig von irgendwelchen .git-Metadaten.

Der Aktualisierungsprozess
Nichts ist einfacher. Einfach folgendes im lokalen Repository ausführen
$ git push web

Damit werden alle neuen Einträge zum Remote-Repository übertragen, wo der post-receive Hook unmittelbar die DocumentRoot für dich aktualisieren wird.
(Dieser Weg ist bequemer als deinen Computer als remote auf dem Server einzustellen und "git pull" manuell oder mittels eines Cron-Jobs auszuführen. Ausserdem musst du deinen Computer so nicht für SSH zugänglich machen.)

Hinweise
Ein paar wenige Sachen sollten noch erwähnt werden.

Zuerst, der Arbeitsbaum (/var/www/www.example.org oben) muss durch den Benutzer, der den Hook ausführt, beschreibar sein (oder der Benutzer benötigt Sudo-Zugriff, um git checkout -f, oder etwas ähnliches ausführen zu können).

Desweiteren muss der Arbeitsbaum nicht genau deiner DocumentRoot entsprechen. Dein Repository kann nur ein Unterverzeichnis davon sein oder es sogar als ein Unterverzeichnis beinhalten.

Du musst im Arbeitsbaum die Umgebungsvariable GIT_DIR auf den Pfad zu website.git setzen, bevor du Git-Befehle (z.B. "git status") ausführen kannst.

Die Einstellung von receive.denycurrentbranch auf dem Server auf "ignore" eliminiert eine Warnung durch aktuelle Versionen von Git, wenn du eine Aktualisierung auf einen abgemeldeten Zweig via push auf den Server hochlädst.

Du kannst das Update via push auf mehrere Remote-Repository hochladen, indem du mehrere URLs im [remote "web"] Abschnitt in deinem .git/config festlegst.
[remote "web"]    
	url = ssh://server.example.org/home/ams/website.git    
	url = ssh://other.example.org/home/foo/website.git

Ausserdem gibt es andere Hooks. Siehe githooks(5) für weitere Informationen. Beispielsweise könntest du pre-receive verwenden, um eine Hochladen via push abhängig vom Ergebnis eines HTML-Validators akzeptieren oder ablehnen. Oder du kannst auch mehr mit dem post-receive hook (z.B. E-Mail an Co-Maintainers senden, siehe contrib/hooks/post-receive-email) arbeiten.

Ich freue mich über Fragen und Anregungen.
1178 Mal gelesen
+3
16. Mär 2011, 19:17

Kommentare

(0)
RSS

Kommentieren

Fett Kursiv Unterstrichen Durchgestrichen   Link Zitieren Code
Ich bin mit den Nutzungsbedingungen einverstanden.
Zukünftige Kommentare zu diesem Beitrag abonnieren (abbestellbar).
 
Bitte klicke jetzt auf den Bestätigungslink in deiner E-Mail.