Veröffentlicht am 19-02-2019

Automatisieren Sie Ihren Workflow mit Git Hooks

Git-Hooks sind eine der am meisten unterschätzten Git-Funktionen und haben das Potenzial, Ihre Produktivität als Entwickler zu steigern. Wollten Sie schon immer bei jedem Commit oder Push einen Befehl ausführen? Zum Glück ist das genau das, was Git Hooks tun - es sind benutzerdefinierte Skripts, die vor oder nach git-Befehlen ausgeführt werden, um manuelle Aufgaben zu automatisieren Lesen Sie weiter, um herauszufinden, wie Hooks Ihren Workflow verbessern können.

Warum git hooks verwenden?

Ich lernte etwas über Hooks, nachdem ich mich auf die Suche nach einer Automatisierung meines eigenen Workflows gemacht hatte. Sehen Sie, zum Besseren oder Schlechteren benutze ich FIXME: Kommentare in meinem Code, um mich daran zu erinnern, etwas nochmals zu überdenken. Mein üblicher Prozess bestand darin, vor dem Festschreiben eine globale Suche nach „FIXME:“ durchzuführen. Ich bin jedoch sicher, dass Sie bereits viel Raum für menschliches Versagen sehen.

Hooks kam zu meiner Rettung. Ich konnte einen einfachen Pre-Commit-Hook (Code am Ende des Beitrags) erstellen, der nach FIXME: -Kommentaren in meinen versuchten Commits sucht und das Commit stoppt, falls vorhanden.

Was wäre, wenn ich einen dieser Kommentare begehen wollte? Haken sind leicht zu überschreiben, wenn sie zum Blocker werden. Durch Übergeben des Parameters --no-verify an den Befehl (z. B. git push --no-verify) werden die zugehörigen Hooks vollständig übersprungen, sodass der Befehl fortgesetzt werden kann.

Da Hooks leicht übersprungen werden können, ist es besser, eine Build-Pipeline zu verwenden, wenn Sie einen Prozess haben, der erzwungen werden muss

Es gibt insgesamt 17 Hooks - einige, die vor einem Befehl ausgeführt werden, andere, die danach ausgeführt werden. Sie können Hooks verwenden, um die Länge der Festschreibungsnachrichten zu erzwingen, eine ausreichende Testabdeckung sicherzustellen, das Festschreiben von Geheimnissen zu verhindern oder einfach nur Spaß mit ASCII-Grafiken zu drucken. Die Möglichkeiten sind endlos.

Haken einrichten

Hooks können auf zwei Arten eingerichtet werden: Sie können für jedes Repo auf Ihrem Computer oder nur innerhalb eines bestimmten Repos ausgeführt werden. Beide Methoden haben Vorteile:

Globale Haken

In Version 2.9.0 von git hinzugefügt, werden globale Hooks für jedes Repository ausgeführt. Dies ist eine großartige Option, wenn Sie persönliche Workflows haben, die für jedes Repository gelten, mit dem Sie interagieren. Git sucht im konfigurierten Hooks-Ordner automatisch nach globalen Hooks und ruft alle gefundenen Hooks auf.

Der Standardspeicherort für globale Hooks lautet: $ GIT_DIR / hooks. Wenn Sie den Speicherort dieses Ordners ändern möchten, können Sie die folgenden Befehle ausführen (~ / .githooks durch den gewünschten Pfad ersetzen):

Repo-Haken

Repo-Hooks werden nur für das Repo ausgeführt, in dem sie leben, und werden übersprungen, wenn ein globaler Hook des gleichen Typs vorhanden ist. Diese Hooks sollten innerhalb des Repos im Verzeichnis .git / hooks abgelegt werden. Sie sind eine großartige Option, wenn Sie Haken haben, die sehr spezifisch für ein Projekt sind.

Denken Sie daran, dass Sie mit Ihrem Repo keine Hooks festlegen können - sie verbleiben auf Ihrem lokalen Computer. Aber wenn Sie darüber nachdenken, wäre das Festhalten von Haken ein Alptraum der Sicherheit. Sie könnte potenziellen Angreifern uneingeschränkten Zugriff gewähren, um böswillige Skripts auf Ihrem Computer ohne jedes Wissen auszuführen, wenn Sie ein neues Repo kopieren.

Haken erstellen

Nun zum Spaß. Wie bereits erwähnt, können Sie 17 Hooks implementieren. Einige meiner Favoriten sind:

  • pre-commit: tritt ein, bevor ein Git-Commit ausgeführt wird, und kann verhindern, dass der Commit ausgeführt wird.
  • post-commit: tritt nach einem git-Commit auf und wird hauptsächlich für Benachrichtigungen verwendet, da dies das Ergebnis der Ausführung nicht beeinflussen kann.
  • pre-push: tritt vor einem git-Push auf und kann den Push verhindern.
  • prepare-commit-msg: tritt vor einem git-Commit auf und kann eine Commit-Nachricht bearbeiten, bevor sie angewendet wird.

Das Erstellen eines Hooks ist so einfach wie das Erstellen einer Datei mit dem Namen des gewünschten Hooks (z. B. .git / hooks / pre-commit) und das Ausführen dieser Datei (chmod + x pre-commit). ← Der ausführbare Teil ist key, andernfalls ignoriert git die Datei und fährt fort.

Wenn der Hook vor einer Operation (z. B. Pre-Commit, Pre-Push) auftritt, haben Sie die Möglichkeit, die Operation des Befehls zu verhindern. Um die Ausführung zu stoppen, muss der Hook mit einem Status ungleich Null beendet werden (z. B. Exit 1). Ansonsten steht es Ihnen frei, Nachrichten zu protokollieren oder alles, was Ihr Herz begehrt.

Hook Beispiel

Zusammenfassend präsentiere ich Ihnen das Shell-Skript, das ich erstellt habe, um das Dilemma FIXME: Anfang dieses Artikels zu lösen. Jede Sprache kann verwendet werden, um einen Hook zu schreiben, aber Shell und Python sind übliche Optionen.

Wenn Sie dieses Skript erneut verwenden möchten, um nach einer anderen Zeichenfolge zu suchen, die nicht festgeschrieben werden soll, können Sie die Variable SEARCH_TERM so ändern, dass in eingehenden Commits nach einem Teilstring gesucht wird.

Was denkst du - sind Git Hooks nützlich für deinen Workflow? Fühlen Sie sich frei, alle in den Kommentaren verwendeten Hooks mitzuteilen.

Wenn Sie diesen Artikel als hilfreich empfunden haben und mehr davon sehen möchten, lassen Sie es mich bitte wissen, indem Sie einige Klatschen hinterlassen.

Siehe auch

Hin und wieder zurück: Die Reise der GO-LIFE App5 Gründe, warum Sie noch nach London ziehen solltenAI & ArchitekturWarum Jupyter nicht mein ideales Notebook istMust-Have-Funktionen der Messaging-AppOptimierung der Ineffizienz: Menschliche Torheit und Suche nach dem schlechtesten Sortieralgorithmus