Automatisieren Sie Ihren Workflow: Ein praktischer Leitfaden zu Git Client-Side Hooks
Git-Hooks sind mächtige, aber oft unterschätzte Werkzeuge innerhalb des Git-Ökosystems. Sie ermöglichen es Entwicklern, benutzerdefinierte Skripte automatisch an bestimmten Punkten im Entwicklungs-Workflow auszulösen – vor oder nach Ereignissen wie dem Committen, Pushen oder Mergen. Für einzelne Entwickler, die an einem lokalen Repository arbeiten, sind Client-Side Hooks unerlässlich, um Code-Qualität sicherzustellen, lokale Tests auszuführen und Pre-Submission-Checks zu standardisieren, ohne sich auf eine zentrale serverseitige Durchsetzung verlassen zu müssen.
Dieser Leitfaden wird die Funktionsweise von Git Client-Side Hooks untersuchen, mit Fokus auf die gängigsten und nützlichsten Typen: pre-commit und post-merge. Durch die Beherrschung dieser Hooks können Sie wiederkehrende Aufgaben automatisieren, Fehler frühzeitig erkennen und die Konsistenz und Zuverlässigkeit in Ihrem täglichen Entwicklungsprozess erheblich verbessern.
Git Hooks verstehen
Git-Hooks sind ausführbare Skripte, die Git automatisch vor oder nach bestimmten Kernoperationen ausführt. Sie befinden sich im .git/hooks-Verzeichnis jedes Git-Repositorys. Git wird mit Beispiel-Hooks (die normalerweise auf .sample enden) geliefert, aber sie werden erst aktiv, wenn Sie sie umbenennen, um die .sample-Erweiterung zu entfernen.
Client-Side vs. Server-Side Hooks
Es ist entscheidend, zwischen den beiden Haupttypen zu unterscheiden:
- Client-Side Hooks: Laufen auf dem lokalen Rechner des Entwicklers (z. B.
pre-commit,commit-msg). Diese eignen sich hervorragend für lokale Validierung und Verbesserungen der Benutzerfreundlichkeit. - Server-Side Hooks: Laufen auf dem zentralen Server, wenn ein Push empfangen wird (z. B.
pre-receive,post-receive). Diese werden typischerweise für projektweite Durchsetzungsrichtlinien verwendet.
Wichtiger Hinweis: Da Client-Side Hooks lokal sind, werden sie nicht automatisch geklont oder geteilt, wenn Sie ein Repository klonen. Jede Einrichtung muss manuell von jedem Entwickler vorgenommen oder über Initialisierungsskripte verwaltet werden.
Client-Side Hooks finden und aktivieren
Alle Client-Side Hooks befinden sich im .git/hooks-Verzeichnis innerhalb Ihres Repositorys.
Wenn Sie ein neues Repository initialisieren, stellt Git Vorlagen bereit:
git init
# Dies erstellt ein .git/hooks-Verzeichnis, das mit Beispieldateien wie pre-commit.sample gefüllt ist
Um einen Hook zu aktivieren, benennen Sie einfach die Beispieldatei um. Um beispielsweise den pre-commit-Hook zu aktivieren:
cd .git/hooks
cp pre-commit.sample pre-commit
chmod +x pre-commit
Hier platzierte Skripte müssen ausführbar sein (daher chmod +x). Sie laufen in der Regel als Shell-Skripte, können aber in jeder Sprache geschrieben werden, vorausgesetzt, die Shebang-Zeile (#!/bin/bash, #!/usr/bin/env python usw.) ist vorhanden und der Interpreter verfügbar ist.
Praktisches Beispiel 1: Der pre-commit-Hook
Der pre-commit-Hook läuft unmittelbar bevor Git nach einer Commit-Nachricht fragt. Er ist der ideale Ort, um Überprüfungen am Code durchzuführen, der committet werden soll.
Häufige Anwendungsfälle für pre-commit:
- Linting/Stilprüfung: Sicherstellen, dass der Code etablierten Stilrichtlinien entspricht (z. B. ESLint, Black).
- Unit-Tests ausführen: Schnelle, kritische Tests ausführen.
- Syntaxprüfung: Grundlegende syntaktische Korrektheit überprüfen.
- Versehentliche Commits verhindern: Sicherstellen, dass keine geheimen Schlüssel oder Debug-Anweisungen zurückbleiben.
Erstellen eines einfachen pre-commit-Hooks (Shell-Beispiel)
Dieses Beispielskript prüft, ob eine für den Commit vorbereitete Datei das Wort TODO: enthält, und lässt den Commit fehlschlagen, wenn dies der Fall ist, wodurch der Entwickler gezwungen wird, diese Platzhalter zu beheben.
Erstellen Sie die Datei .git/hooks/pre-commit und fügen Sie den folgenden Inhalt hinzu:
#!/bin/bash
# 1. Überprüfe die gestageten Dateien auf 'TODO:'
STAGED_FILES=$(git diff --cached --name-only)
if grep -q "TODO:" <<< "$STAGED_FILES"; then
echo "\n[HOOK FEHLGESCHLAGEN] 'TODO:'-Markierungen in gestageten Dateien gefunden. Bitte beheben Sie diese, bevor Sie committen."
# Die spezifischen Dateien mit den Markierungen ausgeben (optional)
git diff --cached | grep "TODO:"
exit 1 # Mit einem Nicht-Null-Status beenden, um den Commit abzubrechen
fi
# 2. Führe eine grundlegende Syntaxprüfung für Python-Dateien durch (erfordert 'python -m py_compile')
for FILE in $(git diff --cached --name-only --diff-filter=ACM | grep '\.py$'); do
echo "Überprüfe Syntax für $FILE..."
python -m py_compile "$FILE" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "[HOOK FEHLGESCHLAGEN] Syntaxfehler in $FILE gefunden."
exit 1
fi
done
# Wenn alle Prüfungen erfolgreich sind
echo "Pre-commit-Prüfungen erfolgreich bestanden."
exit 0 # Mit Null beenden, um den Commit zuzulassen
Wenn das Skript mit einem Nicht-Null-Status (wie exit 1) beendet wird, bricht Git den Commit-Prozess sofort ab und gibt die Fehlermeldung aus.
Best Practice: Für komplexe Linting- und Formatierungsaufgaben sollten Sie externe Hook-Management-Tools wie Husky (für JavaScript-Ökosysteme) oder Pre-commit (ein Framework-agnostisches Tool) in Betracht ziehen, die die Hook-Installation, das Teilen und die Abhängigkeitsverwaltung automatisch übernehmen.
Praktisches Beispiel 2: Der post-merge-Hook
Der post-merge-Hook läuft unmittelbar nach Abschluss eines erfolgreichen git merge-Vorgangs. Dieser Hook ist nützlich für die Durchführung von Bereinigungen oder die Aktualisierung lokaler Abhängigkeiten basierend auf dem neu zusammengeführten Code.
Häufige Anwendungsfälle für post-merge:
- Submodule aktualisieren: Automatisches Aktualisieren abhängiger Repositories.
- Abhängigkeiten neu aufbauen: Ausführen von
npm installoder Ähnlichem, wenn Abhängigkeitsdateien (package.json,requirements.txt) geändert wurden. - Benutzer benachrichtigen: Anzeigen relevanter Branch-Informationen.
Erstellen eines einfachen post-merge-Hooks (Abhängigkeitsaktualisierung)
Wenn Ihr Projekt Node.js verwendet, möchten Sie möglicherweise sicherstellen, dass node_modules nach dem Mergen eines Branches, der package.json oder package-lock.json geändert hat, auf dem neuesten Stand ist.
Erstellen Sie die Datei .git/hooks/post-merge:
#!/bin/bash
echo "Post-merge-Hook ausgelöst."
# Prüfen, ob package.json oder package-lock.json im Merge geändert wurde
if git diff --name-only HEAD@{1} HEAD | grep -Eq "(package\.json|package-lock\.json)"; then
echo "Abhängigkeitsdateien geändert. Führe npm install aus..."
npm install
if [ $? -eq 0 ]; then
echo "Abhängigkeiten erfolgreich aktualisiert."
else
echo "WARNUNG: npm install ist nach dem Merge fehlgeschlagen. Bitte führen Sie 'npm install' manuell aus."
fi
else
echo "Abhängigkeitsdateien unverändert. Überspringe npm install."
fi
exit 0
Dieser Hook nutzt Gits Ref-Log-Funktionen (HEAD@{1} bezieht sich auf den Zustand vor dem Merge), um die Dateien zu vergleichen, wodurch die Aktion bedingt wird und unnötige Ausführungen vermieden werden.
Andere nützliche Client-Side Hooks
Während pre-commit und post-merge häufig verwendet werden, können mehrere andere Client-Side Hooks Ihren Workflow optimieren:
commit-msg: Läuft, nachdem der Benutzer die Commit-Nachricht eingegeben hat, aber bevor der Commit finalisiert wird. Nützlich zum Durchsetzen von Commit-Nachrichten-Standards (z. B. Conventional Commits-Format).pre-rebase: Läuft, bevor ein Rebase startet. Kann prüfen, ob bestimmte Branches vor dem Rebasieren geschützt werden sollten.post-checkout: Läuft nach einem erfolgreichengit checkout. Nützlich zum Wechseln von Umgebungsvariablen oder Tooling-Konfigurationen basierend auf dem ausgecheckten Branch.
| Hook-Name | Auslösezeitpunkt | Primärer Anwendungsfall |
|---|---|---|
pre-commit |
Vor der Commit-Erstellung | Code-Linting, lokale Tests, Formatierung |
commit-msg |
Nach Nachrichteneingabe | Durchsetzen des Nachrichtenformats (z. B. JIRA-Tickets) |
post-merge |
Nach erfolgreichem Merge | Submodule aktualisieren, Abhängigkeiten aktualisieren |
post-checkout |
Nach erfolgreichem Checkout | Umgebungskonfigurationen wechseln |
Zusammenfassung und nächste Schritte
Client-Side Git-Hooks bieten eine overheadfreie Möglichkeit, wiederkehrende Aufgaben zu automatisieren und lokale Qualitätsstandards direkt in Ihrer Entwicklungsumgebung durchzusetzen. Sie dienen als entscheidende erste Verteidigungslinie gegen schlampige Commits und Integrationsprobleme.
Um sie effektiv zu nutzen:
- Wiederkehrende Aufgaben identifizieren: Bestimmen Sie Überprüfungen, die Sie manuell vor dem Committen oder Mergen durchführen.
.git/hookslokalisieren: Navigieren Sie zu diesem Verzeichnis in Ihrem Projekt.- Aktivieren und Skripten: Kopieren Sie die
.sample-Datei, benennen Sie sie um, stellen Sie sicher, dass sie ausführbar ist (chmod +x), und schreiben Sie Ihre Automatisierungslogik. - Management-Tools in Betracht ziehen: Für Teams sollten Sie Tools wie
pre-commituntersuchen, um Hook-Installationen über Entwickler hinweg zu synchronisieren.