Git-Hooks

Veröffentlicht: 2022-07-02

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