Heim >Technologie-Peripheriegeräte >IT Industrie >Eine Einführung in Git -Hooks
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:
Die Hook -Dateien
<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.sampleWir werden uns auf den Pre-Commit-Haken konzentrieren, der vor dem Erlauben eines Commits ausgeführt wird.
Ein Beispiel Hook: Validierung von PHP -Syntax
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:
<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.
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.sampleJeder, der Ihr Projekt klont
Dies hat auch den Vorteil, dass Sie Ihre Haken unter der Versionskontrolle halten.
Andere Hooks
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>
häufig gestellte Fragen (FAQs) zu Git Hooks
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.
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.
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!