git hooks - post-checkout

Kategorie: Blog Veröffentlicht: Donnerstag, 06. Februar 2014 Drucken E-Mail

Wir haben bei uns im Team (20+ Entwickler) das Problem, daß ab und zu von einem Branch abgezweigt wird, von dem man nicht abzweigen sollte. Wenn dann keiner beim Review richtig aufpasst landet unerwünschter Code in dem Branch der live deployed wird. Um solche Fälle abzufangen und natürlich noch vieles mehr bittet git hooks an. Hooks sind Scripte die vor oder nach einem git Befehl ausgeführt werden. Dabei ist es egal in welche Sprache man diese verfasst, sie müssen nur ausgeführt werden können. Meistens bieten sich Bash oder Shell Scripte an die Aufgaben zu erledigen. Die Scripte liegen im Repository Ordner immer unter .git/hooks, von Haus aus liefert git schon ein paar Beispielscripte mit. Benannt werden müssen die Dateien immer nach dem Trigger der gefeuert wird. Mit git hooks --help im hooks Ordner kann man sich die Trigger erklären lassen.

Folgende Trigger stellt git zur Verfügung

  • applypatch-msg
  • pre-applypatch
  • post-applypatch
  • pre-commit
  • prepare-commit-msg
  • commit-msg
  • post-commit
  • pre-rebase
  • post-checkout
  • post-merge
  • pre-receive
  • update
  • post-receive
  • post-update
  • pre-auto-gc
  • post-rewrite

Wie man sieht erklären sich die Trigger meist von selbst, sie werden entweder vor oder nach einem Event ausgeführt. In unserem Fall müsste eigentlich ein pre-checkout Hook herhalten, leider gibt es den aber nicht. Also müssen wir nach dem Checkout prüfen, ob von einem nicht erlaubten branch abgezweigt wurde und das Ganze bei Bedarf reverten. Das Bash Script dazu umfasst ein paar Zeilen, die eventuell Ärger ersparen können.

#!/bin/bash

########
##
##  simple post-commit hook to prevent checkout from forbitten branches
##
########
OLDBRANCH=$(git rev-parse --abbrev-ref @{-1})
NEWBRANCH=$(git rev-parse --abbrev-ref HEAD)
ERROR="\e[31mERROR:\e[0m"
STANDARD="production" # change this to your needs
FORBITTEN=('staging' 'development' 'integration' 'master') # change this to your needs

for i in "${FORBITTEN[@]}"
do
    if [ "$i" == "$OLDBRANCH" ] ; then
        git checkout "$STANDARD"
        git branch -D "$NEWBRANCH"
        echo -e "$ERROR Du wolltest gerade vom nicht erlaubten \e[31m$OLDBRANCH\e[0m branch auschecken"
        echo -e "$ERROR branch wurde auf \e[31m$STANDARD\e[0m zurück gesetzt"
        echo ""
        echo ""
        echo "may the source be with you;-)"
        exit 1
    fi
done
exit 0

Alle anderen Dinge die nach einem Checkout vielleicht noch erledigt werden müssen kommen einfach ebenfalls in das Script. Man könnte vielleicht noch prüfen ob es schon einen Remote Branch mit dem gleichen Namen wie den neuen Branch gibt und dann entsprechend darauf reagieren.

Sobald mir für die anderen Hooks Fallbeispiele einfallen gibts hier mehr davon.

über mich
Michael Pfister
Autor: Michael Pfister
Seit mehr als 12 Jahren Webentwickler mit Schwerpunkt PHP, Javascript und CSS Zur Zeit arbeite ich bei T-Systems Schweiz als System Engineer mit dem Schwerpunkt Automatisierung. Und nebenbei fahr ich noch Fahrrad;-)

Zugriffe: 6141
Cookies erleichtern die Bereitstellung unserer Dienste. Mit der Nutzung unserer Dienste erklären Sie sich damit einverstanden, dass wir Cookies verwenden.
Weitere Informationen Ok