Software-Entwicklung mit Git: Serverseitige Git-Hooks (Teil 1)

Git-Hooks sind Skripte, mit denen wir das Verhalten von Git zu bestimmten Zeitpunkten beeinflussen können. Nachdem wir in in unserer letzten Artikelreihe lokale Hooks besprochen haben, kommen wir nun zu den serverseitigen Hooks. Diese funktionieren wie lokale, außer dass sie in serverseitigen Repositories liegen (in der Regel das zentrale Repository oder das öffentliche Repo eines Entwicklers). Wenn sie an das offizielle Repository angehängt sind, können einige von ihnen als Möglichkeit dienen, eine Policy durchzusetzen, indem bestimmte Commits abgelehnt werden.

Es gibt drei serverseitige Hooks, die wir nun diskutieren wollen:

  • pre-receive
  • update
  • post-receive

Mithilfe dieser Hooks können wir auf verschiedene Stadien des git push-Prozesses reagieren.

Pre-Receive

Der Hook pre-receive wird immer dann ausgeführt, wenn jemand mithilfe von git push Commits zum Repository pusht. Er sollte stets in dem Remote-Repo liegen, das das Ziel des Pushs bildet, und nicht im Ursprungs-Repository.

Der Hook wird ausgeführt, bevor irgendwelche Referenzen aktualisiert werden, und eignet sich damit gut zum Durchsetzen bestimmter Development-Policies. Wenn uns nicht gefällt, wer den Commit pusht, wie die Commit-Message formatiert ist oder welche Änderungen der Commit enthält, können wir ihn einfach ablehnen. Wir können Entwickler zwar nicht davon abhalten, missgestaltete Commits zu machen, aber wir können verhindern, dass diese Commits in die offizielle Codebasis gelangen, indem wir sie mit pre-receive zurückweisen.

Das Skript nimmt keine Parameter, aber jede Ref, die gepusht wird, wird dem Skript auf einer separaten Zeile (Standard-Input) im folgenden Format übergeben:

<old-value> <new-value> <ref-name>

Wie dieser Hook funktioniert, können wir uns an einem sehr einfachen pre-receive-Skript ansehen, das die gepushten Refs einfach liest und sie ausdruckt.

#!/usr/bin/env python

import sys
import fileinput

# Read in each ref that the user is trying to update
for line in fileinput.input():
    print "pre-receive: Trying to push ref: %s" % line

# Abort the push
# sys.exit(1)

Nochmals: Dies ist ein bisschen anders als die anderen Hooks, weil dem Skript Informationen via Standard-Input übergeben werden statt als Kommandozeilen-Argumente. Nachdem wir das obige Skript im .git/hooks-Verzeichnis eines Remote-Repositorys platziert haben und den master-Branch pushen, sollten wir etwas wie dies hier in unserer Konsole sehen:

b6b36c697eb2d24302f89aa22d9170dfe609855b 85baa88c22b52ddd24d71f05db31f4e46d579095 refs/heads/master

Wir können diese SHA1-Hashes zusammen mit einigen Lower-Level-Git-Befehlen nutzen, um die Änderungen zu inspizieren, die eingeführt werden sollen. Einige Anwendungsfälle dafür sind diese:

  • Ablehnen von Änderungen, die ein Upstream-Rebasing beinhalten
  • Verhindern von Nicht-Fast-Forward-Merges
  • Prüfen, ob der User die korrekten Berechtigungen hat, um die Änderungen vorzunehmen (relevant v.a. in zentralisierten Git-Workflows)

Wenn mehrere Refs gepusht werden, verwirft ein Nicht-Null-Status von pre-receive sie alle. Wenn wir Branches auf Von-Fall-zu-Fall-Basis akzeptieren oder ablehnen wollen, müssen wir stattdessen den update-Hook verwenden. Dazu mehr im zweiten Teil des Tutorials zu serverseitigen Git-Hooks.

Git und Bitbucket Server effektiv nutzen? Wir sind Ihr Partner!

Kennen Sie Bitbucket Server (vormals Stash), Atlassians Git-Repository-Managementsystem? Bitbucket Server bietet eine zentrale Lösung zum Management des gesamten distributierten Codes: Hier kommen alle Git-Repositories im Unternehmen zusammen, hier finden Entwickler immer die letzte offizielle Version eines Projekts, hier können Projektverantwortliche Berechtigungen kontrollieren, um sicherzustellen, dass die richtigen Nutzer Zugriff auf den richtigen Code haben. Möchten Sie mehr erfahren? Wir sind offizieller Vertriebspartner von Atlassian und einer der größten Atlassian Experts Partner weltweit. Gerne unterstützen wir Sie bei der Evaluierung, Lizenzierung und Adaption von Bitbucket Server.

Übrigens: //SEIBERT/MEDIA bietet auch professionelle Grundlagen- und Aufbau-Workshops zu Git und Bitbucket Server an.

Weiterführende Infos

99 Argumente für Bitbucket Server (Stash) als Git-Repository-Manager
Branch-basierte Git-Workflows adaptieren
Echte Integration: Das Zusammenspiel von JIRA, Stash und Bamboo
Interview: Die Vorteile von Git in der Software-Entwicklung und die Möglichkeiten von Bitbucket Server (Stash)
So funktioniert die Lizenzierung von Atlassian-Produkten