517 Stimmen

Können Git-Hook-Skripte zusammen mit dem Repository verwaltet werden?

Wir würden gerne ein paar grundlegende Hook-Skripte erstellen, die wir alle gemeinsam nutzen können - für Dinge wie die Vorformatierung von Commit-Nachrichten. Git hat dafür Hook-Skripte, die normalerweise unter <project>/.git/hooks/ . Diese Skripte werden jedoch nicht weitergegeben, wenn jemand einen Klon erstellt, und sie sind nicht versionskontrolliert.

Gibt es eine gute Möglichkeit, allen zu helfen, die richtigen Hakenskripte zu bekommen? Kann ich diese Hook-Skripte einfach auf versionskontrollierte Skripte in meinem Repo verweisen lassen?

10voto

yuranos Punkte 6632

Die meisten modernen Programmiersprachen, bzw. deren Build-Tools, unterstützen Plugins zur Verwaltung von Git-Hooks. Das bedeutet, dass Sie lediglich Ihre paket.json , pom.xml usw., und jeder in Ihrem Team wird keine andere Wahl haben, als sich daran zu halten, es sei denn, er ändert die Build-Datei.

Das Plugin fügt den Inhalt des .git-Verzeichnisses für Sie hinzu.

Beispiele:

Git Build Hook Maven Plugin

githook-maven-plugin

git-hooks-js

4voto

cattail Punkte 352

Utilice git-hooks . Es leitet .git/hooks in Skripten im Projektverzeichnis aufrufen, githooks .

Es gibt auch viele Funktionen, die es Ihnen ermöglichen, Kopier- und Symlink-Haken überall zu minimieren.

4voto

Mike de Klerk Punkte 11132

Wir verwenden Visual Studio-Lösungen (und damit Projekte), die Pre- und Post-Build-Ereignisse haben. Ich füge ein zusätzliches Projekt namens 'GitHookDeployer' hinzu. Das Projekt selbst ändert eine Datei im Post-Build-Ereignis. Diese Datei wird in das Build-Verzeichnis kopiert. So wird das Projekt jedes Mal gebaut und nie übersprungen. Im Build-Ereignis stellt es außerdem sicher, dass alle Git-Hooks vorhanden sind.

Beachten Sie, dass dies keine allgemeine Lösung ist, da es bei manchen Projekten natürlich nichts zu bauen gibt.

2voto

Shimon Tolts Punkte 1498

Sie könnten eine verwaltete Lösung für die Verwaltung von Pre-Commit Hooks verwenden, wie Vorabüberweisung . Oder eine zentralisierte Lösung für serverseitige Git-Hooks wie Datree.io . Es verfügt über integrierte Richtlinien wie:

  1. Erkennen und verhindern Verschmelzung von Geheimnissen .
  2. Durchsetzung der ordnungsgemäßen Git-Benutzerkonfiguration .
  3. durchsetzen. Integration von Jira-Tickets - Erwähnen Sie die Ticketnummer im Namen der Pull-Anfrage / Commit-Nachricht.

Es wird nicht alle Ihre Hooks ersetzen, aber es könnte Ihren Entwicklern bei den offensichtlichsten helfen, ohne die Konfigurationshölle der Installation der Hooks auf jedem Entwickler-Computer/Repos.

Haftungsausschluss: Ich bin einer der Gründer von Datrees

2voto

Lovato Punkte 2144

Idealerweise werden die Hooks in Bash geschrieben, wenn Sie den Beispieldateien folgen. Sie können sie aber auch in jeder anderen verfügbaren Sprache schreiben und müssen nur sicherstellen, dass sie das Flag "ausführbar" haben.

Sie können also einen Python- oder Go-Code schreiben, um Ihre Ziele zu erreichen, und ihn im Ordner hooks ablegen. Er wird funktionieren, aber er wird nicht zusammen mit dem Repository verwaltet werden.

Zwei Optionen

a) Mehrere Skripte

Sie können Ihre Hooks innerhalb Ihrer Hilfe kodieren und ein kleines Codefragment zu den Hooks hinzufügen, um Ihr perfektes Skript aufzurufen, etwa so:

$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/myprecommit.js

b) Einzelne Schrift

Eine kühlere Option ist es, nur ein Skript hinzuzufügen, um sie alle zu beherrschen, anstatt mehrere. Sie erstellen also ein hooks/mysuperhook.go Datei und verweisen Sie auf alle Haken, die Sie haben möchten.

$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/mysuperhook.go $(basename $0)

Der Parameter gibt Ihrem Skript an, welcher Hook ausgelöst wurde, und Sie können ihn in Ihrem Code differenzieren. Warum? Manchmal möchten Sie vielleicht dieselbe Prüfung für Commit und Push durchführen, zum Beispiel.

Und dann?

Dann möchten Sie vielleicht weitere Funktionen haben, wie z. B.:

  • Lösen Sie den Hook manuell aus, um zu prüfen, ob alles in Ordnung ist, noch bevor ein Commit oder Push erfolgt. Wenn Sie einfach Ihr Skript aufrufen (Option a oder b) würde den Trick tun.
  • Auslösen der Haken an CI Sie brauchen also nicht dieselben Prüfungen für CI neu zu schreiben. Es wäre nur der Aufruf der Commit- und Push-Trigger, zum Beispiel. Die gleiche wie die oben sollte es zu lösen.
  • Rufen Sie externe Tools auf, wie einen Markdown-Validator oder ein YAML Prüfer. Sie können Syscalls ausführen und müssen Standardausgabe und Standardfehler behandeln.
  • Stellen Sie sicher, dass alle Entwickler eine einfache Möglichkeit haben, die Hooks zu installieren. Dazu muss ein nettes Skript zum Repository hinzugefügt werden, das die Standard-Hooks durch die richtigen ersetzt
  • Einige globale Hilfen, wie z.B. eine Prüfung zum Blockieren von Übertragungen an Entwicklungs- und Master-Zweige, die nicht zu jedem Repository hinzugefügt werden muss. Sie können das Problem lösen, indem Sie ein weiteres Repository mit globalen Skripten haben.

Kann das einfacher sein?

Ja, es gibt mehrere Tools, die Ihnen bei der Verwaltung von Git-Hooks helfen. Jedes von ihnen ist darauf zugeschnitten, das Problem aus einer anderen Perspektive anzugehen, und Sie müssen möglicherweise alle verstehen, um das für Sie oder Ihr Team am besten geeignete Tool zu finden. GitHooks.com bietet eine Menge Lesestoff zum Thema Hooking und verschiedene heute verfügbare Tools.

Bis heute sind dort 21 Projekte mit unterschiedlichen Strategien zur Verwaltung von Git-Hooks aufgeführt. Einige tun es nur für einen einzigen Hook, andere für eine bestimmte Sprache usw.

Eines dieser Tools, das von mir geschrieben und als Open-Source-Projekt kostenlos angeboten wird, heißt hooks4git . Es ist in Python geschrieben (weil ich es mag), aber die Idee ist, alle oben aufgeführten Punkte in einer einzigen Konfigurationsdatei namens .hooks4git.ini das sich in Ihrem Repository befindet und jedes beliebige Skript in jeder Sprache aufrufen kann, das Sie aufrufen möchten.

Die Verwendung von Git-Hooks ist absolut fantastisch, aber die Art und Weise, wie sie angeboten werden, bringt die Leute meist nur davon ab.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X