Quick Tipp: Mit Git Hooks ungewollte Commits vermeiden
Was sind Git Hooks?
Git feuert bei bestimmten Aktionen bestimmte Events. Mittels Git Hooks können diese Events benutzerdefinierte Skripte starten. Es gibt client-seitige und server-seitige Hooks. Git v2 kennt u.a. diese Hooks [1]:
Client-seitige Hooks
- pre-commit <- das ist der Git Hook, den ich in diesem Blogpost verwende
- prepare-commit-msg
- commit-msg
- post-commit
- applypatch-msg
- pre-applypatch
- post-applypatc
- pre-rebase
- post-rewrite
- post-checkout
- post-merge
- pre-push
Server-seitige Hooks
- pre-receive
- update
- post-receive
Speicherort
Alle Hooks werden im Unterverzeichnis hooks des Git-Verzeichnisses gespeichert. Dies kann sowohl local, global oder system-weit sein!
Obacht: Git Hooks sind nicht Bestandteil des Repositories, werden also beim Klonen nicht kopiert!
Git Hook 'pre-commit' einrichten
In diesem Blogpost konzentriere ich mich auf den client-seitigen Git Hook pre-commit, den ich auf meinem PC global einrichte. Damit stelle ich sicher, dass meine Arbeitsweise in jedem Git Repository auf meinem PC funktioniert. Der Hook soll verhindern, dass ich aus Versehen bestimmte Informationen ins Repository speichere [2].
Zuerst muss man das globales Git Config Verzeichnis finden. Dazu kann man z.B. das folgende Kommando ausführen:
git config --global --list --show-origin
Globale Git Konfiguration
Der Befehl listet die aktuellen globale Git Konfiguration samt der zugehörigen Konfigurationsdatei (z.B. "file:C:/Users/max/.gitconfig"). Falls in der Liste bereits die Konfiguration core.hookspath erwähnt wird, dann hat man schon richtigen Speicherort gefunden. Typische Speicherorte sind "~/.gitconfig/hooks", "~/.config/git/hooks" oder "~/.git/hooks".
Falls die globale Git Konfigurationsdatei noch nicht die Option core.hookspath enthält,dann kann diese durch das folgende Kommando hinzugefügt werden:
git config --global core.hooksPath ~/.gitconfig/hooks
Alternativ kann die globale Git Konfigurationsdatei entsprechend bearbeitet werden. Im Abschnitt [code] wird diese Zeile hinzugefügt:
[core]
hooksPath = ~/.gitconfig/hooks
pre-commit Hook erstellen
Im konfigurierten core.hooksPath Verzeichnis (im Beispiel: ~/.gitconfig/hooks) muss dann noch eine einfache Textdatei erzeugt werden. Falls Sie dazu den Dateimanager Explorer verwenden, achten Sie darauf, dass die Datei ohne die Erweiterung TXT erstellt wird! Einfacher ist es mit diesem Kommando:
type NUL > %userprofile%/.gitconfig/hooks/pre-commit
Wechseln Sie dann, z.B. mit dem Dateimanager Explorer, ins core.hooksPath Verzeichnis und bearbeiten Sie die Datei pre-commit, z.B. mit der Anwendung Editor. Der Inhalt der Datei ist:
#!/usr/bin/env sh
# Concat the trigger together to make it easier to
# track this script itself
TRIGGER_WORD="no"
TRIGGER_WORD+="checkin"
# Check for trigger word in staged changes
if git diff --cached | grep '^+' | grep -q -i "${TRIGGER_WORD}"; then
echo "Commit rejected: '${TRIGGER_WORD}' found in staged changes."
exit 1
fi
exit 0
Git Hook 'pre-commit' in Aktion
Der zuvor eingerichtete Git Hook steht unmittelbar nach dem Speichern der Datei zur Verfügung. In diesem Abschnitt zeige ich, wie der Hook funktioniert. Der Hook funktioniert in jeder IDE und mit jeder Programmiersprache.
Beispiel-Code
Als Beispiel nehme ich diese Funktion, die anhand des aktuellen Datums einen bestimmten Wert berechnet:
function getValueExample: number {
const now = new Date();
const result = calculate(now);
return result;
}
Je nach aktuellem Datum erhalte ich mit dieser Funktion unterschiedliche Werte. Um den Rückgabewert an einem bestimmten Datum zu überprüfen, könnte ich entweder bis zu diesem Datum warten. Oder ich setze dieses Datum temporär im Code und führe ihn dann aus, also so:
function getValueExample: number {
//const now = new Date();
const now = new Date("2026-02-29");
const result = calculate(now);
return result;
}
Dieser Ansatz birgt die Gefahr, dass die temporäre Änderung aus Versehen commitet, also ins Repository geschrieben wird!
Die unbeabsichtigte Veröffentlichung meiner temporären Änderung möchte ich auf jeden Fall vermeiden. Daher habe ich mir angewöhnt, in solchen Fällen immer das Schlüsselwort nocheckin zu verwenden. Meine vorübergehende Code-Änderung würde ich also so vornehmen:
function getValueExample: number {
//const now = new Date();
const now = new Date("2026-02-29"); // nocheckin
const result = calculate(now);
return result;
}
An der Ausführung des Codes ändert sich dadurch nichts. Wenn ich jetzt allerdings (aus Versehen) versuche, meine Änderung ans Repository zu schicken, dann erhalten ich folgende Fehlermeldung:

Da die Lösung Git-basiert ist, spielt es keine Rolle, ob ich dem Commit in der Kommandozeile oder in irgendeiner IDE starte. In Visual Studio Code sieht die Meldung beispielsweise so aus:

Mit diesem Ansatz und einer strikten Arbeitsweise (!) lassen sich also ungewollte Veröffentlichungen von z.B. vertraulichen Informationen vermeiden.