5 Einfache Git Hooks zur Verwaltung Ihres Repositories

Git ist ein brillantes Werkzeug. Es ermöglicht Ihnen nicht nur, Ihre Änderungen in einer Datei über Hooks nachzuverfolgen, sondern auch nahtlos mit anderen Personen zusammenzuarbeiten. In dieser Hinsicht ist Git ein Werkzeug, das die Entwicklung von FOSS vorangetrieben hat.
Eines der größten Probleme mit Git ist jedoch, dass es Zeit und Mühe kostet, Ihre Repositories zu verwalten. Zum Beispiel kann das Committen und Synchronisieren dieser Repositories zwei bis drei Git-Befehle erfordern. Dies macht die Verwaltung nicht nur mühsam, sondern auch anfällig für Benutzerfehler. Hier zeigen wir Ihnen einige einfache, aber effektive Git Hooks, um Ihre Repositories besser zu verwalten.
Hinweis: Sie können Git auch in Emacs verwalten. Erfahren Sie wie!
Inhaltsverzeichnis
- Was sind Git Hooks?
- Verhindern Sie das Pushen zum Master
- Ablehnen von Pushes zum Master-Branch
- Sperren des Repositories vor Rebasing
- Erzwingen einer Stil- und Syntaxprüfung für Ihren Code
- Automatische Benachrichtigung der Benutzer über Repository-Änderungen
- Häufig gestellte Fragen
Was sind Git Hooks?
Im Kern ist git-hook ein flexibles Subkommando, das Sie verwenden können, um benutzerdefinierte Skripte zu erstellen, die jedes Mal ausgeführt werden, wenn Git eine Aktion an einem Repository durchführt. Zum Beispiel ist es möglich, einen Hook zu verwenden, um Ihr Repository automatisch auf Stilfehler zu überprüfen, bevor Sie es überhaupt committen.

Das Hook-Subkommando funktioniert, indem es den “hooks”-Ordner im “ .git”-Verzeichnis Ihres Repositories liest. Dieser Ordner enthält eine Reihe von vorgefertigten Dateien, die ein Beispielskript für jede Aktion in Git bereitstellen, die Sie automatisieren können.

In den meisten Fällen können Sie einen Git Hook in jeder gewünschten Skriptsprache schreiben. Dies macht es unglaublich flexibel und zugänglich für jeden Softwareentwickler.
Tipp: Um mit Git zu beginnen, müssen Sie zuerst den Benutzernamen und die E-Mail von Git einrichten. Erfahren Sie in diesem Leitfaden, wie.
1. Verhindern Sie das Pushen zum Master
Einer der häufigsten Fehler, die ein Benutzer in Git macht, ist das Pushen eines Commits von einem Entwicklungsbranch direkt zum Master. Dies kann unglaublich frustrierend sein, wenn Sie Github verwenden, um Ihre Projekte zu verfolgen und zu verwalten.

Sie können dieses Problem verhindern, indem Sie einen “pre-push” Git Hook erstellen, der überprüft und bestätigt, wann immer Sie versuchen, ein Repository vom Master-Branch zu pushen.
- Gehen Sie zu dem Git-Repository, das Sie schützen möchten.

- Erstellen Sie eine Git Hook-Datei mit Ihrem Überprüfungsskript. Da dies ein Hook ist, der vor einem “Push” ausgeführt werden soll, müssen Sie eine “pre-push” Hook-Datei erstellen:
touch .git/hooks/pre-push- Öffnen Sie Ihre neue Hook-Datei in einem Texteditor.
nano .git/hooks/pre-push- Schreiben Sie darin Ihren neuen “pre-push” Hook. Zum Beispiel ist das folgende ein Skript, das nach Ihrer Bestätigung fragt, wenn Sie vom Master-Branch pushen:
#!/bin/sh
protect='master'
current=$(git symbolic-ref HEAD |sed-e's,.*/\(.*\),\1,')
if[$protect = $current]
then
read-p"Bestätigen Sie den Push zum Master? Y/n."-n1-r/dev/null
then
exit0
fi
exit1
else
exit0
fi- Speichern Sie Ihren neuen Hook. In nano tun Sie dies, indem Sie Ctrl + O drücken, dann Ctrl + X.

- Führen Sie den folgenden Befehl aus, um sicherzustellen, dass Git Ihren neuen Hook ausführen kann.
chmod +x .git/hooks/pre-push2. Ablehnen von Pushes zum Master-Branch
Neben der Verhinderung, dass Sie zum Master pushen, können Sie auch einen serverseitigen Hook erstellen, der alle Pushes zu seinem Master-Branch ablehnt. Dies ist unglaublich nützlich, wenn Sie ein Repository mit mehreren Entwicklern teilen.

Beheben Sie dies, indem Sie einen “pre-receive” Hook erstellen, der automatisch verhindert, dass ein eingeschränkter Benutzer zum Master-Branch pushen kann.
- Erstellen Sie die “pre-receive” Git Hook-Datei in Ihrem Remote-Repository.
touch .git/hooks/pre-receive- Öffnen Sie diese Datei.
nano .git/hooks/pre-receive- Fügen Sie das Ablehnungsskript in Ihren “pre-receive” Hook ein. Zum Beispiel sollten die folgenden Zeilen Code sofort funktionieren:
#!/bin/sh
branch=$(git symbolic-ref HEAD |sed-e's,.*/\(.*\),\1,')
blacklist=(alice bob)
if[[${blacklist[*]} =~ $USER]]; then
if["$branch" == "master"]; then
echo"Sie dürfen keine Änderungen in diesem Branch committen"
exit1
fi
fiSpeichern Sie Ihre neue Hook-Datei. In meinem Fall muss ich Ctrl + O drücken, dann Ctrl + X, um die Datei zu speichern.
Speichern Sie Ihr Hook-Skript und machen Sie es ausführbar.
chmod +x .git/hooks/pre-receiveTipp: Sie können auch Git-Alias verwenden, um die Nutzung von Git effizienter zu gestalten.
3. Sperren des Repositories vor Rebasing
Ein weiterer häufiger Fehler, den ein Benutzer in Git macht, ist das Rebasing des aktuell aktiven Branches. Dies kann ein frustrierendes Problem sein, wenn Sie an einem Repository mit mehreren Mitwirkenden arbeiten, da das Rebasing die Commits entfernt, die andere Benutzer gemacht haben.

Sie können dieses Problem verhindern, indem Sie einen “pre-rebase” Hook erstellen, der überprüft, ob der aktuelle Branch gesperrt ist.
- Erstellen Sie eine “pre-rebase” Datei in Ihrem “ .git/hooks” Verzeichnis:
touch .git/hooks/pre-rebase- Öffnen Sie diese Datei zur Bearbeitung.
nano .git/hooks/pre-rebase- Fügen Sie das Rebase-Skript in Ihre neue Hook-Datei ein.
#!/bin/sh
branch="$2"
[-n"$branch"]||branch=$(git rev-parse--abbrev-ref HEAD)
lock="branch.${branch}.rebaselock"
if["$(git config --bool "$lock")" = true]; then
echo"pre-rebase hook: \"$lock\" ist auf true gesetzt. Weigern Sie sich zu rebasen."
exit1
fi- Speichern Sie Ihre neue Hook-Datei und machen Sie sie ausführbar.
chmod +x .git/hooks/pre-rebase4. Erzwingen einer Stil- und Syntaxprüfung für Ihren Code
Eine der hilfreichsten Anwendungen eines Git Hooks besteht darin, ihn mit einem Code-Linter zu verknüpfen. Dies ist ein einfaches Programm, das überprüft, ob Ihr Code den Stil und das Format für ein Projekt einhält.

- Um einen Linter mit Ihrem Git-Repository zu verknüpfen, erstellen Sie zuerst eine “pre-commit” Hook-Datei.
touch .git/hooks/pre-commit- Installieren Sie den entsprechenden Linter für die Sprache Ihres Projekts. In diesem Fall verwende ich “shellcheck”, um meinen Bash-Code zu analysieren:
sudo apt install shellcheck- Öffnen Sie Ihre neue Hook-Datei und fügen Sie das folgende Skript hinzu.
#!/bin/bash
forfilein $(git diff--cached--name-only--diff-filter=AM |grep-E'\.sh$')
do
shellcheck "$file"# Führen Sie den Linter für jede neue Datei aus.
if[$?-ne0]; then
exit1# Beenden Sie das Commit, wenn der Linter fehlschlägt.
fi
done- Speichern Sie Ihre neue Hook-Datei und machen Sie sie ausführbar:
chmod +x .git/hooks/pre-commit5. Automatische Benachrichtigung der Benutzer über Repository-Änderungen
Zuletzt können Sie auch einen Git Hook erstellen, der automatisch eine E-Mail sendet, wann immer Ihr Repository einen neuen Commit erhält. Dies ist hilfreich, wenn Sie ein einfaches Benachrichtigungssystem für Ihr Repository erstellen möchten.
- Erstellen Sie eine “post-receive” Hook-Datei im .git/hooks Verzeichnis Ihres Repositories:
touch .git/hooks/post-receive- Öffnen Sie Ihre neue Git Hook-Datei und geben Sie das folgende Skript ein:
#!/bin/sh
commit_message=$(git log-1--pretty=%B)
users=("[email protected]""[email protected]""[email protected]")
for user in"${users[@]}"; do
mail -s"Neuer Commit: $commit_message"$user- Speichern Sie Ihre neue Hook-Datei und machen Sie sie ausführbar.
chmod +x .git/hooks/post-receiveHäufig gestellte Fragen
Kann ich meine Git Hooks in einer kompilierten Sprache wie C schreiben?
Eine der größten Einschränkungen von Git Hooks ist, dass Sie eine Sprache verwenden müssen, die Sie direkt aus dem Terminal ausführen können. Das bedeutet, dass Git Hooks keine kompilierte Sprache für seine Skripte unterstützt. Zum Beispiel können Sie einen neuen Git Hook entweder mit Python oder Shell erstellen, aber nicht mit C oder C++.
Ist es möglich, mehrere Hooks im selben Git-Repository auszuführen?
Ja. Während die obigen Beispiele Hooks als einzelne, diskrete Funktionen zeigen, können Sie sie leicht kombinieren, um Ihren eigenen einzigartigen Workflow zu erstellen, wodurch Git Hooks unglaublich flexibel und anpassbar für jede Codierungssituation sind. Zum Beispiel können Sie sowohl den “Prevent Push to Master” pre-push Hook als auch den “Syntax Check” pre-commit Hook in Ihrem eigenen Repository verwenden.
Warum senden die E-Mail Git Hooks keine E-Mail an Benutzer?
Dieses Problem liegt höchstwahrscheinlich daran, dass Ihr Remote-Server nicht in der Lage ist, ausgehende E-Mails ordnungsgemäß zu senden. Um dies zu beheben, stellen Sie sicher, dass Ihr Remote-Server sicher ist und dass er über einen funktionierenden Mail-Delivery-Agenten sowie eine SMTP-Domain verfügt.
Bildnachweis: Unsplash. Alle Änderungen und Screenshots Ramces Red.