5 Einfache Git Hooks zur Verwaltung Ihres Repositories

5 Git Hooks 00 Featured Image

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?
    1. Verhindern Sie das Pushen zum Master
    1. Ablehnen von Pushes zum Master-Branch
    1. Sperren des Repositories vor Rebasing
    1. Erzwingen einer Stil- und Syntaxprüfung für Ihren Code
    1. 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.

5 Git Hooks 02 Example Linter

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.

5 Git Hooks 03 Default Hooks Directory

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.

5 Git Hooks 04 Example Git Push

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.

  1. Gehen Sie zu dem Git-Repository, das Sie schützen möchten.

5 Git Hooks 05 Cd To Repository

  1. 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
  1. Öffnen Sie Ihre neue Hook-Datei in einem Texteditor.
nano .git/hooks/pre-push
  1. 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
  1. Speichern Sie Ihren neuen Hook. In nano tun Sie dies, indem Sie Ctrl + O drücken, dann Ctrl + X.

5 Git Hooks 07 Pre Push Hook Filled

  1. Führen Sie den folgenden Befehl aus, um sicherzustellen, dass Git Ihren neuen Hook ausführen kann.
chmod +x .git/hooks/pre-push

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

5 Git Hooks 08 Git Log Sample

Beheben Sie dies, indem Sie einen “pre-receive” Hook erstellen, der automatisch verhindert, dass ein eingeschränkter Benutzer zum Master-Branch pushen kann.

  1. Erstellen Sie die “pre-receive” Git Hook-Datei in Ihrem Remote-Repository.
touch .git/hooks/pre-receive
  1. Öffnen Sie diese Datei.
nano .git/hooks/pre-receive
  1. 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  
fi
  1. Speichern Sie Ihre neue Hook-Datei. In meinem Fall muss ich Ctrl + O drücken, dann Ctrl + X, um die Datei zu speichern.

  2. Speichern Sie Ihr Hook-Skript und machen Sie es ausführbar.

chmod +x .git/hooks/pre-receive

Tipp: 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.

5 Git Hooks 11 Git Rebase Man Page

Sie können dieses Problem verhindern, indem Sie einen “pre-rebase” Hook erstellen, der überprüft, ob der aktuelle Branch gesperrt ist.

  1. Erstellen Sie eine “pre-rebase” Datei in Ihrem “ .git/hooks” Verzeichnis:
touch .git/hooks/pre-rebase
  1. Öffnen Sie diese Datei zur Bearbeitung.
nano .git/hooks/pre-rebase
  1. 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
  1. Speichern Sie Ihre neue Hook-Datei und machen Sie sie ausführbar.
chmod +x .git/hooks/pre-rebase

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

5 Git Hooks 14 Shellcheck Man Page

  1. Um einen Linter mit Ihrem Git-Repository zu verknüpfen, erstellen Sie zuerst eine “pre-commit” Hook-Datei.
touch .git/hooks/pre-commit
  1. 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
  1. Ö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
  1. Speichern Sie Ihre neue Hook-Datei und machen Sie sie ausführbar:
chmod +x .git/hooks/pre-commit

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

  1. Erstellen Sie eine “post-receive” Hook-Datei im .git/hooks Verzeichnis Ihres Repositories:
touch .git/hooks/post-receive
  1. Ö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
  1. Speichern Sie Ihre neue Hook-Datei und machen Sie sie ausführbar.
chmod +x .git/hooks/post-receive

Hä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.