|

PreCommitHook - Debugging-Statements in Commits vermeiden

Freitag, 17 Uhr:

So, Arbeit getan. Jetzt noch schnell committen und pushen...

$ git status
$ git add --all
$ git commit -m'Add new feature'
$ git push

Oops, da hab ich schon wieder ein debugger; vergessen zu entfernen und die Konsolenausgaben sind auch noch drin!

Wer sich mit dem Obigen wiedererkennt, wünscht sich vielleicht einen, der Ihm kurz vorm Committen auf die Schulter tipps und fragt: "Hast du auch den Debugging-Code entfernt?".
Dieser neue Freund könnte git sein. Nicht von Haus aus, aber man kann git schnell dazu bringen zu bestimmten Zeitpunkten bestimmte Aktionen durchzuführen.

Ich möchte vor jedem Commit in allen Repositories prüfen, ob ich in meinen Änderungen Debugging-Code liegen lassen habe. Dazu benutze ich einen git Hook, im Speziellen einen Pre Commit Hook.

Git-Templates

Zuerst muss ein globales Template-Directory fest- und angelegt werden.

git config --global init.templatedir '~/.git-templates'
mkdir -p ~/.git-templates/hooks

Wenn ein neues git-Repo initialisiert wird, wird der Inhalt des (globalen) durch init.templatedir festgelegten Ordners in den (lokal) Ordner des Repos gelegt. Das wollen wir!

Pre Commit Hook einrichten

Jetzt muss in diesem Ordner das Script mit dem Namen pre-commit angelegt werden

vi ~/.git-templates/hooks/pre-commit

Ersetze vi durch den Editor deiner Wahl. Ich habe das Script nicht neu erfunden und mich bei Gerad Suyderhoud bedient. Funktioniert einwandfrei.
Das Script muss noch ausführbar gemacht werden.

chmod a+x $_

Letzterer Befehl macht das Script ausführbar. $_ ist dabei der letzte Parameter des letzten Shell-Befehls also der Pfad des pre-commit Scripts.

Im Repo nutzen

Im .git-Ordner von meinen bestehenden Projekten ist jetzt der pre-commit Hook nicht verfügbar. Hier ist der git init Prozess schon lange vorbei. Ein neuerliches git init im Projektordner ist aber nicht schädlich und schafft Abhilfe. Also:

cd /path/to/my/repo/
git init

Ergebnis

Ich bin in meinem Repo und beabreite die Datei libraries/mylib.js indem ich in zwei Zeilen ein debugger;- und ein console.log-Statement schreibe.
Wieder Freitag, 17 Uhr:

So, Arbeit getan. Jetzt noch schnell committen und pushen...

$ git status
$ git add --all
$ git commit -m'Add new Feature'
*
* You have some suspicious patch lines:
*
* In libraries/mylib.js
* debugger breakpoint left in (line 167)
libraries/mylib.js:167:    debugger;
* console logging left in (line 173)
libraries/mylib.js:173:    console.log('Hello World');

Der Commit ist nicht durchgeführt worden. Saved my day!

Ausnahmen bestätigen die Regel

Wenn ich aber doch mal unbedingt ein solches Statement committen möchte, kann ich den pre-commit Hook umgehen, indem ich mit

git commit --no-verify -m'Add new Feature'

committe.