Heim >Technologie-Peripheriegeräte >IT Industrie >Eine Einführung in Git -Hooks

Eine Einführung in Git -Hooks

Christopher Nolan
Christopher NolanOriginal
2025-02-21 08:58:11927Durchsuche

An Introduction to Git Hooks

Eine Einführung in Git -Hooks

Key Takeaways

  • Git -Hooks sind einfache Skripte, die vor oder nach bestimmten Aktionen ausgeführt werden, z.
  • Es gibt zwei Arten von Hooks: clientseitig, die auf dem System des Entwicklers ausgeführt werden, und Server-Seite, die auf dem Server mit dem Git-Repository ausführen.
  • Git -Hooks werden weder mit Ihrem Projekt verteilt noch können sie automatisch installiert werden. Daher ist es vorteilhaft, einen Ort zu erstellen, an dem Ihre Hooks leben und Ihre Mitarbeiter verwenden sollen.
  • Git -Hooks sind ein leistungsstarkes Mittel, um den Workflow Ihres Projekts zu automatisieren, sodass Sie Code validieren, Nachrichten festlegen, sicherstellen können, dass die Umgebung ordnungsgemäß ist und mehr.
Git -Hooks sind einfache Skripte, die vor oder nach bestimmten Aktionen ausgeführt werden. Sie sind nützlich für eine Vielzahl von Aufgaben, aber in erster Linie finde ich sie für die validierende validierende Kunden nützlich, sodass einfache Fehler verhindert werden können. Sie können beispielsweise die Syntax auf von Dateien testen, die begangen werden und sogar Tests ausgeführt werden können. Ich habe Haken geschrieben, die die Twig -Syntax validieren, JSHINT auf einen Standard ausführen, und vieles mehr.

Git -Haken sind auch für das Design extrem einfach. Git wird diese Haken ausgeführt, wenn das Skript ausführbar ist und Git zulässt, dass die Aktion (z. B. Festschreibung oder Push) auftritt, solange der Haken ohne Fehler ausgeht (Status 0). Haken können in jeder Sprache geschrieben werden, mit der die Umgebung arbeiten kann.

Es gibt zwei Arten von Haken:

    clientseitig-diese werden auf dem System des Entwicklersystems ausgeführt
  • serverseitig-diese werden auf dem Server ausgeführt, auf dem das Git-Repository
  • gehostet wird
serverseitige Hooks werden in diesem Artikel nicht behandelt. Beachten Sie jedoch, dass serverseitige Hooks im Allgemeinen nicht zutreffend sind, wenn sich Ihr Projekt in einem Dienst wie GitHub befindet. Auf GitHub ist das Äquivalent mit serverseitigen Hooks die Verwendung von Diensten und Webhooks, die in Ihren Projekteinstellungen zu finden sind.

Die Hook -Dateien

Jedes Repository einschließlich derer, die Sie standardmäßig klonen, hat Beispielhaken im Verzeichnis .git/Hooks:

<span>git clone git@github.com:symfony/symfony.git
</span><span>cd symfony
</span><span>ls .git/hooks</span>
In diesem Verzeichnis sehen Sie so etwas wie:

applypatch-msg.sample
commit-msg.sample
post-update.sample
pre-applypatch.sample
pre-commit
pre-commit.sample
prepare-commit-msg.sample
pre-push.sample
pre-rebase.sample
update.sample
Wir werden uns auf den Pre-Commit-Haken konzentrieren, der vor dem Erlauben eines Commits ausgeführt wird.

Ein Beispiel Hook: Validierung von PHP -Syntax

Wir werden mit einem sehr einfachen Haken beginnen, der in Bash geschrieben wurde und der validierende PHP -Code wird, der begangen wird, hat eine gültige Syntax. Dies soll verhindern, dass ein „schnelles“, aber gebrochenes Commit stattfindet. Natürlich entmutige ich „einfache Commits“, die wenig bis gar keine Tests haben, aber das bedeutet nicht, dass sie nicht passieren werden.

In .git/Hooks Wir können eine neue Datei namens Pre-Commit starten. Es muss Berechtigungen zur Ausführung haben:

<span>git clone git@github.com:symfony/symfony.git
</span><span>cd symfony
</span><span>ls .git/hooks</span>

Sie können Ihren bevorzugten Editor verwenden, um mit dem Schreiben zu beginnen. Zuerst brauchen wir den Shebang. Mein bevorzugter Weg ist es,/usr/bin/env zu verwenden, da dies den richtigen Pfad zur gewünschten Anwendung verwendet, anstatt einen hart codierten und möglicherweise ungültigen Pfad. Im Moment werden wir es kontinuierlich scheitern lassen, damit wir leicht testen können.

applypatch-msg.sample
commit-msg.sample
post-update.sample
pre-applypatch.sample
pre-commit
pre-commit.sample
prepare-commit-msg.sample
pre-push.sample
pre-rebase.sample
update.sample

PHP hat eine nützliche Option für die Syntaxvalidierung: -l. Es dauert ein einzelnes Dateiargument, daher müssen wir alle PHP -Dateien durchlaufen, die geändert werden. Der Einfachheit halber gehen wir davon aus, dass alle PHP -Dateien immer in .php enden. Da der Haken aus dem Stammwurzel des Repositorys ausgeführt wird, können wir Standard -Git -Befehle verwenden, um Informationen über die Änderungen wie Git -Status zu erhalten.

Über der #Always fehlgeschlagene Zeile können wir Folgendes verwenden, um alle PHP -Dateien zu ändern:

<span>cd .git/hooks
</span><span>touch pre-commit
</span><span>chmod +x pre-commit</span>

Erläuterung:

  • php_files = in der Bash -Zuordnung erfolgt ohne Trennzeichen. Beachten
  • $ () ist Syntax für "Ausgabe". Anführungszeichen sind nicht erforderlich, um dies zu verwenden.
  • Grep wird verwendet, um nach hinzugefügten (a) und geänderten Dateien (M)
  • zu überprüfen
  • awk wird hier verwendet, um $ 2 zu drucken. Ein vollständiger GIT -Status -Short Line hat zu Beginn zusätzliche Speicherplatz und zusätzliche Daten. Daher möchten wir das entfernen. Awk führt auch automatisch ab.
  • Grep wird erneut verwendet, prüft aber jetzt, um sicherzustellen, dass die Linien in .php
  • enden
Jetzt können wir jede Datei mit einer für Schleife verifizieren:

<span>#!/usr/bin/env bash
</span><span># Hook that checks PHP syntax
</span>
<span># Override IFS so that spaces do not count as delimiters
</span><span>old_ifs=$IFS
</span><span><span>IFS</span>=$'<span title="\n">\n'</span>
</span>
<span># Always fail
</span><span>exit 1</span>
Das mag ein bisschen seltsam erscheinen, aber! PHP -L "$ i" (beachten Sie die Zitate, um Probleme mit Leerzeichen zu vermeiden) prüft tatsächlich nach einem Rückgabewert von 0, nicht auf wahr oder einer der Werte, die wir normalerweise in anderen Sprachen erwarten. Nur als Referenz wäre der ungefähr äquivalente PHP -Code:

Ein
<span>php_files=<span>$(git status --short | grep -E '^(A|M)' | awk '{ print  }' | grep -E '\.php$')</span></span>

Ich habe den Schleifen so früh wie möglich das gesamte Skript beenden, und dies ist möglicherweise nicht das, was wir wollen. Wir können in der Tat eine Zusammenfassung der Dinge wollen, anstatt weiterhin zu verpflichten. Jeder würde leicht frustriert werden und könnte sogar lernen, Git Commit zu verwenden-nicht verifizieren, um den Haken insgesamt zu umgehen.

<span>for file in $php_files; do
</span>  <span>if ! php -l "<span>$i"</span>; then
</span>    <span>exit 1
</span>  <span>fi
</span><span>done</span>
Stattdessen beenden wir nicht mit PHP -L den Fehler, aber ich möchte immer noch die Dinge leicht zu lesen halten:

Hier erfassen wir die Ausgabe für PHP -L (und erzwingen Sie die Standardfehlerausgabe für die Standardausgabe). Wir überprüfen den Exit -Status von PHP -L mit der speziellen Variablen $? (Welches ist der Exit -Status -Code) und der Operator -eq. Wir geben an, dass ein Syntaxfehler aufgetreten ist (beachten Sie die Verwendung von $ {} für eine Variable in einer Zeichenfolge). Schließlich geben wir die relevante Zeile für Fehler, um die Ausgabe etwas kurzer zu machen (Grepping für '^Parse ERROR'), und wir geben eine leere Linie, um dies etwas lesbarer zu halten.

Ich habe zwei schlechte Modifikationen vorgenommen und die Ausgabe für einen Versuch eines Commits sieht folgendermaßen aus:

<span>git clone git@github.com:symfony/symfony.git
</span><span>cd symfony
</span><span>ls .git/hooks</span>

Jetzt ist die Vorgehensweise, diese Probleme zu beheben, zu testen und erneut zu verpflichten.

Um das Hakenskript zu vervollständigen, entfernen Sie die Ausfahrt 1 am unteren Rand des Skripts. Versuchen Sie, gültige PHP -Dateien zu begehen, und es sollte wie gewohnt funktionieren.

Teilen von Hooks

Hooks werden weder mit Ihrem Projekt verteilt noch können sie automatisch installiert werden. Ihre beste Vorgehensweise ist es also, einen Ort für Sie zu erstellen, an dem Sie Hooks leben können (könnte im selben Repository sein) und Ihren Mitarbeitern mitzuteilen, dass sie sie verwenden sollen. Wenn Sie dies leicht machen, tun sie dies eher.

Eine einfache Möglichkeit, dies zu tun

applypatch-msg.sample
commit-msg.sample
post-update.sample
pre-applypatch.sample
pre-commit
pre-commit.sample
prepare-commit-msg.sample
pre-push.sample
pre-rebase.sample
update.sample
Jeder, der Ihr Projekt klont

Dies hat auch den Vorteil, dass Sie Ihre Haken unter der Versionskontrolle halten.

Andere Hooks

vorbereiten commit-msg-Geben Sie eine Standard-Commit-Nachricht an, wenn einer nicht angegeben ist.
  • commit-MSG-Meldungsvalidierung von Commit.
  • Post-Commit-läuft nach einem erfolgreichen Commit.
  • Pre-Push-Läuft, bevor Git Push nach der Fernbedienung überprüft wird, um zu arbeiten. Es dauert 2 Argumente: den Namen der Fernbedienung und die URL.
  • Pre-Rebase-Läuft vor Git-Rebase.
  • Post-Checkout-Läuft nach einer erfolgreichen Kasse.
  • Post-Merge-Läuft nach einer erfolgreichen Zusammenführung.
  • Diese Haken funktionieren im Allgemeinen genauso wie Vorkommit, obwohl sie Argumente aufnehmen. Ein Anwendungsfall für Post-Checkout besteht darin, sicherzustellen, dass eine Datei immer die richtigen Berechtigungen erhält (da Git nur ausführbare Dateien verfolgt, nicht ausführbarer und symbolischer Link):

Für comment-msg möchten Sie möglicherweise sicherstellen, dass alle Commit-Nachrichten einem Standard entsprechen, wie
<span>cd .git/hooks
</span><span>touch pre-commit
</span><span>chmod +x pre-commit</span>
[Subproject] Nachricht

. Hier ist eins in PHP:

Schlussfolgerung
<span>#!/usr/bin/env bash
</span><span># Hook that checks PHP syntax
</span>
<span># Override IFS so that spaces do not count as delimiters
</span><span>old_ifs=$IFS
</span><span><span>IFS</span>=$'<span title="\n">\n'</span>
</span>
<span># Always fail
</span><span>exit 1</span>

Git -Hooks sind ein leistungsstarkes Mittel, um den Workflow Ihres Projekts zu automatisieren. Sie können Code validieren, Nachrichten begehen, sicherstellen, dass die Umgebung ordnungsgemäß ist und noch viel mehr. Gibt es etwas Interessantes, für das Sie Git Hooks verwenden? Lassen Sie uns in den Kommentaren wissen!

häufig gestellte Fragen (FAQs) zu Git Hooks

Was sind die verschiedenen Arten von Git-Hooks? Client-Seiten-Hooks werden durch Operationen wie das Festlegen und Zusammenführen ausgelöst, während serverseitige Hooks bei Netzwerkoperationen wie Empfangen von Pushed-Commits ausgeführt werden. Jeder Haken kann an Ihre spezifischen operativen Anforderungen angepasst werden.

Wie erstelle ich einen Git -Hook? Hier finden Sie Beispielskripte für verschiedene Haken. Um einen neuen Hook zu erstellen, erstellen Sie eine Datei ohne Erweiterung (z. B. vor dem Unterhalt), machen Sie sie ausführbar und schreiben Sie Ihr Skript.

Wie kann ich Git -Hooks zur Automatisierung verwenden? Beispielsweise können Sie vor jedem Commit mit einem Pre-Commit-Haken automatisch Tests oder einen Schnursinter in Ihrem Code ausführen. Dies stellt sicher, dass nur getestete und ordnungsgemäß formatierte Code für das Repository verpflichtet ist.

Kann ich Git -Hooks mit meinem Team teilen? Dies liegt daran, dass sie im .git -Verzeichnis gespeichert werden, das nicht versioniert ist. Sie können sie jedoch mit Ihrem Team teilen, indem Sie sie in einem separaten Verzeichnis in Ihrem Projekt speichern und ein Skript erstellen, um sie in .git/Hooks zu symlunden.

Wie kann ich Git -Hooks verwenden, um Richtlinien durchzusetzen? >

Git -Hooks können verwendet werden, um Projekt- oder Unternehmensrichtlinien durchzusetzen. Sie können beispielsweise einen Vor-Receive-Haken auf der serverseitig verwenden, um jeden Druck abzulehnen, der Ihre Richtlinie nicht hält (z. B. Commits, die kein bestimmtes Format folgen).

Welche Sprachen Kann ich Git -Hooks schreiben? Die Standard -Beispiele sind in Bash geschrieben, aber Sie können jede Sprache verwenden, mit der Sie sich wohl fühlen, wie Python oder Ruby. Git -Hooks können verwendet werden, um Git in andere Tools zu integrieren. Sie können beispielsweise einen Post-Commit-Hook verwenden, um einen Build in Ihrem kontinuierlichen Integrationsserver auszulösen oder ein Ticket in Ihrem Ausgabeverfolgungssystem zu aktualisieren.

Wie kann ich einen Git-Hook debuggen? Das Debuggen eines Git -Hooks kann durch das Schreiben von Informationen in eine Datei aus dem Hook -Skript geschrieben werden. Zum Beispiel können Sie die Ausgabe von Befehlen in eine Protokolldatei umleiten, um sie später zu überprüfen.

Kann ich Git -Hooks ignorieren? Mit dem Befehl Git Commit können Sie die Option –no-ush-Option verwenden. Dies kann nützlich sein, wenn Sie an einer geringfügigen Änderung arbeiten, bei der die in Ihren Hooks implementierten Schecks nicht erforderlich sind. sind mächtig, sie sollten mit Vorsicht verwendet werden. Ein schlecht geschriebener Haken kann Probleme verursachen, einschließlich der Ablehnung aller Commits oder sogar Datenverlust. Testen Sie Ihre Haken immer gründlich, bevor Sie sie bereitstellen.

Das obige ist der detaillierte Inhalt vonEine Einführung in Git -Hooks. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn