Quick Tipp: Mit Git Hooks ungewollte Commits vermeiden

von Roland Rickborn

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:

Git 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:

Git Fehlermeldung

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

Zurück

© 2006-2026 exensio GmbH
Einstellungen gespeichert
Datenschutzeinstellungen

Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, während andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.

Sie können Ihre Einwilligung jederzeit ändern oder widerrufen, indem Sie auf den Link in der Datenschutzerklärung klicken.

Zu den gesetzlichen Rechenschaftspflichten gehört die Einwilligung (Opt-In) zu protokollieren und archivieren. Aus diesem Grund wird Ihre Opt-In Entscheidung in eine LOG-Datei geschrieben. In dieser Datei werden folgende Daten gespeichert:

 

  • IP-Adresse des Besuchers
  • Vom Besucher gewählte Datenschutzeinstellung (Privacy Level)
  • Datum und Zeit des Speicherns
  • Domain
×
Irving Tschepke
Irving Tschepke
Dipl.-Wirtsch.-Ing.
Peter Soth
Peter Soth
Dipl.-Inform. (FH)
Wir antworten in wenigen Stunden.
Oder rufen Sie einfach an:
×
Irving Tschepke
Irving Tschepke
Dipl.-Wirtsch.-Ing.
Peter Soth
Peter Soth
Dipl.-Inform. (FH)
Wir antworten in wenigen Stunden.
Oder rufen Sie einfach an:
You are using an outdated browser. The website may not be displayed correctly. Close