Git-Hooks
Veröffentlicht: 2022-07-02Git ist ein leistungsstarkes Versionskontrollsystem, bei dem wir in unseren letzten Beiträgen kaum an der Oberfläche gekratzt haben. Heute werden wir uns die Automatisierungsleistung ansehen, die Git Ihnen mit Git Hooks bieten kann.
Jedes Repository erhält eingebaute Hooks, wenn Sie den Befehl git init
verwenden. Wenn ein Repository initialisiert wird, erhalten Sie ein verstecktes .git
Verzeichnis und darin befindet sich ein Verzeichnis namens hooks, das alle Ihre Hooks enthält. Öffnen Sie ein beliebiges Git-Repository, das Sie zur Hand haben, und verwenden Sie ls -a
, um das versteckte Verzeichnis anzuzeigen, und öffnen Sie es dann in Ihrem bevorzugten Code-Editor.
Zu Beginn sehen Sie eine Reihe von Dateien mit .sample
. Dies sind genau das, was sie sagen, Beispielskripts, die Sie in Ihren Projekten verwenden könnten. Die Dateien werden so benannt, dass sie mit dem Hook übereinstimmen, auf dem sie ausgeführt werden. post-commit.sample
läuft also auf dem post-commit
Hook.
Sie können so ziemlich jede Sprache verwenden, um einen Hook zu schreiben. Die Datei wird gemäß der Shebang-Notation oben in der Datei geparst. Wenn Sie node verwenden möchten, verwenden Sie #! /usr/bindi/env node
#! /usr/bindi/env node
und Ihre Datei wird als Knotendatei geparst.
Bevor wir uns damit befassen, was Sie mit Git-Hooks machen können, werfen wir einen Blick auf einige der Hooks, die Ihnen zur Verfügung stehen.
Arten von Git-Hooks
Commit-Workflow-Hooks
pre-commit
wird ausgeführt, bevor Sie Ihre Commit-Nachricht überhaupt eingeben, und kann mit git commit --no-verify
umgangen werden.
prepare-commit-msg
kann verwendet werden, um die Standardnachricht zu bearbeiten, die Sie in Ihrer Commit-Nachricht sehen. Verwenden Sie es, um Entwicklern Anweisungen zu geben, welche Art von Commit-Nachricht sie hinterlassen sollten. Es kann auch verwendet werden, um den Inhalt zu automatisieren, in dem die Nachricht automatisch für Sie generiert wird, wie z. B. Zusammenführungen, oder um Ihrer Commit-Nachricht automatisch eine Problemnummer hinzuzufügen.
commit-msg
kann verwendet werden, um die Commit-Nachricht für Ihr Projekt zu validieren. Vielleicht möchten Sie nicht, dass irgendjemand eine Commit-Nachricht einfügen kann, die einfach sagt: „Umgang mit Leerzeichen“. Sie können diesen Hook verwenden, um das Vorhandensein von Leerzeichen zu erkennen und dann zu beenden und den Benutzer zu warnen, dass er eine bessere Commit-Nachricht haben muss.
post-commit
wird nach allen oben genannten Commit-Hooks ausgeführt. Es ist am nützlichsten für eine Benachrichtigung, dass ein Commit durchgeführt wurde.
Client-Hooks
post-checkout
wird ausgeführt, nachdem Sie einen erfolgreichen git checkout-Befehl ausgeführt haben. Wenn Sie eine Reihe großer Dateien auf der Website verwendet haben, diese aber nicht in der Quellcodeverwaltung haben möchten, können Sie diesen Befehl verwenden, um die Dateien für Sie zu verschieben.
pre-push
wird während eines Git-Push-Befehls ausgeführt, bevor Objekte an das Remote-Repository übertragen werden.
Server-Hooks
pre-receive
wird ausgeführt, wenn ein Client Code an ein Remote-Repository gepusht hat. Dies kann verwendet werden, um den gepushten Code zu überprüfen, um sicherzustellen, dass er die Kriterien Ihres Projekts erfüllt, bevor Sie den Push akzeptieren.
post-receive
wird ausgeführt, nachdem Ihr Remote-Repository die Aktualisierungen erhalten hat. Dies könnte verwendet werden, um einen Web-Hook aufzurufen, der einen Bereitstellungsprozess auslöst, oder um einen Chatroom zu benachrichtigen, dass ein Commit empfangen wurde und zur Überprüfung bereit ist.
Viele der oben genannten Hooks können so eingestellt werden, dass sie nur auf bestimmten Zweigen ausgeführt werden. Das kann bedeuten, dass Sie einen post-receive
Hook nur dann verwenden, wenn jemand Code an den Hauptzweig gepusht hat, der zur Bereitstellung bereit sein soll. Eine Liste von Entwicklern könnte benachrichtigt werden, um den Code zu überprüfen und ihn dann bereitzustellen. Auf diese Weise haben Sie immer zwei Augenpaare auf eine Bereitstellung, was bedeuten kann, dass Fehler aufgedeckt werden, die ein einzelner Entwickler leicht übersehen kann.
Ich habe einige der verfügbaren Hooks übersprungen, weil ich nie eine Notwendigkeit gesehen habe, sie zu verwenden. Eine Reihe von Hooks, über die ich nicht gesprochen habe, sind die E-Mail-Workflow-Hooks. Wenn Sie Patches für Ihren Code nicht per E-Mail akzeptieren, werden Sie sie wahrscheinlich nie benötigen. Alle verfügbaren Hooks finden Sie in der Dokumentation.
In der Praxis habe ich am häufigsten folgende Hooks verwendet:
- vorab verpflichten
- Vorschub
- Commit-Nachricht
- vorab erhalten
- post-commit
- nach Erhalt
Lass uns jetzt etwas mit diesen Haken machen.
Aktivieren eines WordPress-Plugins mit WP Cli und Git Hooks
Für ein Kundenprojekt in diesem Jahr habe ich ein Geschäft hinzugefügt und immer noch ein paar Aufgaben auf der Hauptseite erledigt. Das bedeutete, dass auf der Hauptseite keines unserer WooCommerce-Plugins installiert oder aktiviert war. Ich musste den WooCommerce-Shop in einem Branch entwickeln und erst als ich bereit war, alles live zu schalten, wollte ich WooCommerce auf den Main übertragen.
Zu Beginn brauchen wir einen neuen Zweig namens Laden. Wir können dies erhalten, indem wir git checkout -b store
verwenden. Dadurch wird ein neuer Zweig erstellt und für uns ausgecheckt. Jetzt machen wir den Haken fertig.
Zuerst müssen wir den Post-Checkout-Hook mit diesem Befehl touch .git/hooks/post-checkout
erstellen.
Als nächstes müssen wir es ausführbar machen. Wir können dies mit dem Befehl chmod vom Terminal chmod +x .git/hooks/post-checkout
tun.
Öffnen Sie nun die Datei in Ihrem Code-Editor Ihrer Wahl und kopieren Sie den folgenden Code in Ihre post-checkout
Datei.
#! /bin/bash
wp plugin activate woocommerce
echo "activated WooCommerce"
wp plugin activate automatewoo
echo "activated AutomateWoo"
Sie können dies demonstrieren, indem Sie über das Terminal zu einem beliebigen Zweig wechseln. Sie sollten zwei Zeilen sehen, die Ihnen mitteilen, dass WooCommerce und AutomateWoo aktiviert wurden. Wir wissen, dass es funktioniert, aber es ist nicht ganz das, was wir wollen, weil es die Plugins jedes Mal einschaltet, wenn wir zu einem Zweig wechseln.
Was wir wirklich wollen, ist, sie einzuschalten, wenn wir in unsere Filiale gehen, und sie dann auszuschalten, wenn wir in unserer Hauptfiliale sind. Dazu benötigen wir den Hook, um zu erkennen, welcher Zweig wir sind. Tauschen Sie den Inhalt des post-checkout
mit dem untenstehenden Code aus.
#! /bin/bash
oldrev=$1
newrev=$2
branch_name="(git symbolic-ref HEAD 2>/dev/null)"
if [ "refs/head/store" = "$branch_name" ];then
wp plugin activate woocommerce
echo "activated Woo"
wp plugin activate automatewoo
echo "activated AutomateWoo"
fi
if [ "refs/head/main" = "$branch_name" ];then
wp plugin deactivate woocommerce
echo "deactivated Woo"
wp plugin deactivate automatewoo
echo "deactivated AutomateWoo"
fi
Dieser Code beginnt damit, dass wir den Zweig, den wir auschecken, der Variablen branch_name
. Dann haben wir zwei if-Anweisungen. Der erste prüft, ob wir in die Ladenfiliale umgezogen sind. Wenn wir es haben, wird WP CLI verwendet, um WooCommerce und AutomateWoo zu aktivieren.
Die nächste if-Anweisung prüft, ob wir uns im Hauptzweig befinden. Wenn ja, werden die Plugins mit WP CLI deaktiviert und uns im Terminal darüber informiert.
Steuern von Git-Workflows mit Git-Hooks
In einem früheren Beitrag zu Git habe ich über verschiedene Git-Workflows gesprochen. Ein sehr häufiger Anwendungsfall für Hooks besteht darin, jemanden daran zu hindern, Code direkt in den Hauptzweig zu übertragen. Sie können einen Hook verwenden, um sicherzustellen, dass der gesamte Code aus einem anderen Zweig in main zusammengeführt wird.
Benennen Sie zunächst pre-commit.sample
in pre-commit
und machen Sie es dann wie oben beschrieben ausführbar. Als nächstes schnappen Sie sich den folgenden Code und verwenden Sie ihn in der Pre-Commit-Datei.
#! /bin/bash
username=$GIT_AUTHOR_NAME
branch="$(git symbolic-ref HEAD 2>/dev/null)"
if [ "$branch" = "refs/heads/main" ]; then
echo "WHOA that was '"${branch}"' you should not do that. Stop doing silly stuff and create your own branch and merge it."
exit 1 # if you remove this it won't block the commit but it will send the message to slack
fi
Dadurch wird überprüft, ob wir uns im Hauptzweig befinden, und wenn dies der Fall ist, wird der Commit gestoppt. Dann druckt es eine Erinnerung an den Benutzer, dass er sich nicht direkt auf den Hauptzweig festlegen sollte.
Denken Sie daran, dass viele Orte zu main
als Zweigstelle wechseln. Ältere Projekte benötigen hier möglicherweise einen master
, wenn sie nicht aktualisiert wurden.
Sie könnten sogar noch einen Schritt weiter gehen und mit cURL auf die API einer Chat-App zugreifen und sich dann öffentlich darüber beschweren, dass jemand versucht hat, sich auf main festzulegen.
Die einzigen Einschränkungen von Git-Hooks sind Ihre Vorstellungskraft. Sie könnten sie verwenden, um jemanden am Commit zu hindern, wenn ein TODO in seinem Code vorhanden ist, oder um Leerzeichen am Ende einer Datei zu stoppen.
Wenn Sie einen Teil Ihres Workflows haben, der ein ständiger Stolperstein ist, sehen Sie sich Hooks an, um ihn zu automatisieren, damit Sie sich nicht daran erinnern müssen.