Hook
Mit Hooks kann an verschiedenen Stellen in den git-Workflow eingegriffen werden. Auf Seiten des Clients gibt es zum Beispiel einen Hook, um Skripte direkt vor dem Commit abzusetzen. Auf der Seite des Servers können Hooks verwendet werden, um unsaubere Commits von Benutzern abzulehnen.
Ein git-Hook ist in der Regel ein Skript in beliebiger Sprache, welches ausführbar im Ordner hooks im git-Repository abgelegt wird (/.git/hooks bzw. /hooks). Anhand des Dateinamens wird bestimmt, wann das Skript zum Einsatz kommt. Die Datei pre-receive wird zum Beispiel ausgeführt, sobald ein push bei einem git-Repository ankommt. Parameter werden nicht als Argumente übergeben, sondern müssen vom STDIN eingelesen werden. Hier wird pro Zeile ein Triplet (alte Revision, neue Revision und Refname) übergeben. Hier ein kurzes Gerüst für einen pre-receive Hook:

#!/usr/bin/php

Mit den SHA-Hashes der Revisionen und verschiedenen git-Befehle können die gepushten Änderungen zerpflückt und gegebenenfalls abgelehnt werden, indem ein Wert ungleich 0 zurückgegeben wird. Fehlermeldungen können über den STDOUT an den Benutzer weitergegeben werden. Im Folgendem noch ein paar nützliche git-Befehle um an den Inhalt der Änderungen zu kommen.

  • git diff $oldrev $newrev
    • Zeigt alle gewünschten Änderungen an, welche zum Beispiel nach nicht erlaubten Strings durchsucht werden können.
  • git diff-tree -r $oldrev $newrev
    • Zeigt Dateien, die geändert werden, an.
  • git ls-tree -r $newrev
    • Gibt alle Dateien von $newrev zurück (inklusive dem <object>-Identifier).
  • git cat-file blob <object>
    • Gibt den Inhalt der Datei mit dem <object>-Identifier zurück. Der Inhalt kann an einen beliebigen Syntaxchecker übergeben werden.

Das Titelbild steht unter der PublicDomain Lizenz und wurde von WikimediaCommons zur Verfügung gestellt.

Achim Ledermüller
Achim Ledermüller
Senior Manager Cloud

Der Exil Regensburger kam 2012 zu NETWAYS, nachdem er dort sein Wirtschaftsinformatik Studium beendet hatte. In der Managed Services Abteilung ist er für den Betrieb und die Weiterentwicklung unserer Cloud-Plattform verantwortlich.