Webseite mit Git verwalten

Mit Git lässt sich nicht nur Programmcode sondern auch Seitenquelltext verwalten. Damit kann ich ein bequemes Deployment für Webseiten einrichten.

Das Problem

Ich möchte für mich eine Versionskontrolle meiner Webseiten haben. Da kann ich dann viel hemmungsloser am Quelltext drehen. Es gibt immer einen bequemen Weg zurück. Zusätzlich möchte ich die Webseite die ich lokal entwickle möglichst einfach auf den Server bringen. Ebenso will ich unterschiedliche Branches verwalten können. Einen für den Produktivbetrieb und einen bis mehrere in denen ich neue Sachen ausprobiere. Auch ein guter Zeitpunkt um mit Git etwas vertrauter zu werden. Bislang kenne ich mich mit älteren Sourceverwaltungen wie SVN oder Perforce besser aus.

Die Lösung: Git

Git ist eine verteilte Sourceverwaltung. Einige „gewohnte“ Sachen funktionieren anders. Im Prinzip ist jedes Git Repository für sich eigenständig. Da ich mit Hauptrechner und Laptop arbeite und zusätzlich auch noch eine virtuelle Maschine mit einem Linux einsetze will ich dort die Quellen synchron halten können. Um mir mein Hirn nicht zu sehr zu verknoten lege ich auf meinem Server ein „zentrales“ Repository an. In Git muss so etwas ein bare Repository sein. Dort landen meine commits, bei Git nennt sich das push. Mit Hilfe einer direkten Gegenüberstellung von SVN und Git lässt sich das System noch besser verstehen.

Das zentrale Repository

Auf meinem Server will ich den zentralen Ablageort für die Sourcen haben. Das ganze muss ein bare repository sein. Ist mit wenigen Befehlen eingerichtet:

Der lokale Rechner

Auf meinem lokalen Rechner lege ich ebenfalls ein Repository an. Da ich hier mit Dateien arbeite ist es ein normales Repository (kein bare). Auf meinem Linux Testsystem verwende ich die Kommandozeile. Für Windows gibt es auch hübsche grafische Frontends. Da ich SmartSVN wirklich hübsch finde und es von den Funktionen fast an Perforce herankommt habe ich dort SmartGit der gleichen Firma im Einsatz.

Ein neues Repository ist super schnell erzeugt:

Dort lege ich meine Dateien für die Webseite ab. Die werden dann bei Git erst mal zum lokalen Repository hinzugefügt:

Das Übertragen zum Server

Das Übertragen von Dateien an ein anderes Repository nennt sich bei Git push. Das ist der Weg mit dem ich meine Dateien auf das Repository auf meinem Server bekomme. Git verwendet für den Zugriff auf den Server meine SSH Schlüssel.

Ich muss eine Verbindung von meinem lokalen Repository zum zentralen Repository herstellen. Dazu gebe ich dem remote repository einen Namen (web) und lege einen Branch mit Namen master an:

Das schreibt meinen lokalen master Branch auf den Server.

Die Updates

Ich kann auf meinem lokalen Rechner jetzt ganz normal entwickeln. Meine Änderungen committe ich auf das lokale Repository. Wenn ich denke dass es so weit ist das auf den Server zu bringen kann ich das mit einem einzelnen Befehl erledigen.

Ähnlich einfach bekomme ich die Sourcen auf meine anderen Rechner. Das Repository wird dorthin geclont.

Automatische Aktualisierung der Website

Wie schaffe ich es nun dass die Website automatisch aktualisiert wird wenn ich neue Daten per push in das Repository gebracht habe? Git stellt dazu eine ganze Reihe von Hooks bereit die zu verschiedenen Zeitpunkten im Prozess aufgerufen werden. Mit so einem Hook lässt sich nach dem Empfang (post-receive) die Version in das Webroot bringen. Der Trick dabei ist es über eine Umgebungsvariable das Git-Working Verzeichnis auf das Webverzeichnis zu stellen.

Angenommen meine Website wird von Apache hier gesucht: /var/www/mysite

Ich gehe in mein Repository auf dem Server und lege dort einen Hook an:

Die Datei mache ich noch ausführbar. Der Useraccount mit dem ich meine Zugriffe auf das Repository mache muss in dem Zielverzeichnis auch Schreibrechte haben.

Damit wird automatisch nach jedem Push das Webverzeichnis aktualisiert. Dabei landen nur die eigentlichen Dateien im Webroot. Die Git Verwaltungsstruktur bleibt draußen.

5 Gedanken zu „Webseite mit Git verwalten

  1. Hallo,
    was ist wenn ich für Testzwecke einen Branch anlege, wie bekomme ich den auf die Webseite? Ich habe bis jetzt noch keine Lösung gefunden. Ich habe den Branch an das bare Repository gepusht, aber über den Hook geht es nicht weiter. Ein pull vom Webverzeichnis aus, bringt auch nicht das gewünschte Ergebnis. Auf der Webseite wird immer nur der master Branch angezeigt.
    Gruß
    Gregor

    • Schwer zu sagen was da genau bei Dir schief läuft. Eigentlich müsste es so gehen. Bin leier immer noch kein git Experte. Du könntest mal prüfen welchen branch du wohin pushen willst. Der Hook verwendet ziemlich sicher den „master“. Das ist eventuell nicht was du willst. Mit git push kannst du auch weitere Namen, auch für den remote-branch angeben. Wobei ich jetzt nicht wüste warum du einen Entwicklungsbranch auf das Produktivsystem pushen willst. Wahrscheinlich wäre es besser das lokal zu mergen (nach master) und dann zu pushen. Oder du hast mehrere Repositories auf dem Server, eines für Produktion und eines für Test. Dann kannst du auch wieder die Hooks verwenden.

  2. Großartiges Tutorial! Ich bin nicht mal auf die Idee gekommen Git in dieser Form einzusetzen. Das erleichtert mir die Arbeit ungemein. Danke dafür. 🙂

  3. Hi, ist es möglich in der Webseiten Struktur nur einzelne Ordner ins Git zu legen bzw. auszuschließen?

    Hintergrund ist, dass z.B. Ordner mit Userdaten, Downloads usw. nicht ins Git sollen und auch nicht das config file mit den Passwörtern, was im Dev auch anders sein sein (für DB mit random Pseudo Daten)

    Wie ist deine Erfahrung bisher? Setzt du die Lösung immer noch ein?

    • Du kannst einzelne Dateien oder Ordner ausschließen. Dazu in „.gitignore“ eintragen. Einen Entwicklungszweig kannst du beispielsweise haben wenn du für die Entwicklung einen eigenen Branch anlegst.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.