it-swarm.com.de

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

Wir möchten ein paar grundlegende Hook-Skripte erstellen, die wir alle gemeinsam nutzen können - zum Beispiel zum Vorformatieren von Commit-Nachrichten. Git hat dazu Hook-Skripte, die normalerweise unter <project>/.git/hooks/ Gespeichert sind. Diese Skripte werden jedoch nicht weitergegeben, wenn Benutzer einen Klon ausführen, und sie sind nicht versionskontrolliert.

Gibt es einen guten Weg, um jedem zu helfen, die richtigen Hook-Skripte zu finden? Kann ich diese Hook-Skripte einfach auf versionskontrollierte Skripte in meinem Repo verweisen lassen?

281
Pat Notz

Theoretisch könnten Sie in Ihrem Projektverzeichnis ein hooks -Verzeichnis (oder einen beliebigen Namen) mit allen Skripten erstellen und diese dann in .git/hooks Symbolisieren. Natürlich müsste jede Person, die das Repo geklont hat, diese Symlinks einrichten (auch wenn Sie sehr schick werden und ein Deployment-Skript haben könnten, das der Kloner ausführen könnte, um sie halbautomatisch einzurichten).

Um den Symlink auf * nix zu erstellen, müssen Sie nur Folgendes tun:

root="$(pwd)"
ln -s "$root/hooks" "$root/.git/hooks"

verwenden Sie ln -sf, wenn Sie überschreiben möchten, was in .git/hooks enthalten ist.

134
mipadi

In Git 2.9 gibt die Konfigurationsoption core.hooksPath ein benutzerdefiniertes Hook-Verzeichnis an.

Verschieben Sie Ihre Hooks in ein nachverfolgtes Verzeichnis hooks in Ihrem Repository. Konfigurieren Sie dann jede Instanz des Repositorys, um hooks anstelle von $GIT_DIR/hooks Zu verwenden:

git config core.hooksPath hooks

Im Allgemeinen kann der Pfad absolut oder relativ zu dem Verzeichnis sein, in dem die Hooks ausgeführt werden (normalerweise das Stammverzeichnis des Arbeitsbaums; siehe Abschnitt BESCHREIBUNG von man githooks ).

175
Max Shenfield

Wenn Ihr Projekt ein JavaScript-Projekt ist und Sie npm als Paketmanager verwenden, können Sie shared-git-hooks verwenden, um Githooks für npm install Zu erzwingen.

12
kilianc

Wie wäre es mit git-hooks , es route .git/hooks Im Skript unter Projektverzeichnis githooks aufrufen.

Es gibt auch viele Funktionen, mit denen Sie das Kopieren und Verknüpfen von Inhalten überall minimieren können.

4
cattail

Die meisten modernen Programmiersprachen bzw. deren Build-Tools unterstützen Plugins zur Verwaltung von Git-Hooks. Das heißt, Sie müssen lediglich Ihre package.json, pom.xml usw. konfigurieren, und jeder in Ihrem Team hat keine andere Wahl, als die Anforderungen zu erfüllen, es sei denn, er ändert die Build-Datei. Das Plugin fügt Inhalt zum .git-Verzeichnis für Sie hinzu.

Beispiele:

https://github.com/olukyrich/githook-maven-plugin

https://www.npmjs.com/package/git-hooks

4
yuranos87

Wir verwenden Visual Studio-Lösungen (und damit Projekte), die Pre- und Post-Build-Ereignisse haben. Ich füge ein zusätzliches Projekt mit dem Namen 'GitHookDeployer' hinzu. Das Projekt ändert selbst eine Datei im Postbuild-Ereignis. Diese Datei wird in das Erstellungsverzeichnis kopiert. Somit wird das Projekt jedes Mal neu erstellt und nie übersprungen. Im Build-Fall wird auch sichergestellt, dass alle Git-Hooks vorhanden sind.

Beachten Sie, dass dies keine allgemeine Lösung ist, da einige Projekte natürlich nichts zu erstellen haben.

3
Mike de Klerk

Sie können Ihren Hooks-Ordner zu einem weiteren Git-Repository machen und es als Submodul verknüpfen ... Ich denke, es lohnt sich nur, wenn Sie viele Mitglieder und Hooks regelmäßig gewechselt haben.

1
Empus

Sie können eine verwaltete Lösung für die Hook-Verwaltung vor dem Festschreiben wie pre-commit verwenden. Oder eine zentralisierte Lösung für serverseitige Git-Hooks wie Datree.io . Es verfügt über integrierte Richtlinien wie:

  1. Erkennen und verhindern Sie Zusammenführen von Geheimnissen .
  2. Erzwinge richtige Git-Benutzerkonfiguration .
  3. Enforce Jira Ticket Integration - Erwähnen Sie die Ticketnummer im Pull-Request-Namen/der Commit-Nachricht.

Es wird nicht alle Ihre Hooks ersetzen, aber es könnte Ihren Entwicklern helfen, die offensichtlichsten zu finden, ohne dass Sie die Hooks auf jedem Entwicklercomputer/-repo installieren müssen.

Haftungsausschluss: Ich bin einer der Gründer von Datrees

1
Shimon Tolts

Für Nodejs Benutzer besteht eine einfache Lösung darin, package.json mit zu aktualisieren

{
  "name": "name",
  "version": "0.0.1",
  ......
  "scripts": {
    "preinstall": "git config core.hooksPath hooks", 

Die Vorinstallation wird vorher ausgeführt

npm install

und leitet git um, um nach Hooks im Verzeichnis .\hooks (oder einem von Ihnen gewählten Namen) zu suchen. Dieses Verzeichnis sollte . \. Git\hooks in Bezug auf den Dateinamen (abzüglich der .sample) und die Struktur imitieren.

Stellen Sie sich vor, Maven und andere Build-Tools haben eine Entsprechung zu Vorinstallation.

Es sollte auch auf allen Plattformen funktionieren.

Wenn Sie weitere Informationen benötigen, lesen Sie https://www.viget.com/articles/two-ways-to-share-git-hooks-with-your-team/

1
Shane Gannon

Im Idealfall werden Hooks in Bash geschrieben, wenn Sie den Beispieldateien folgen. Aber Sie können es in jeder verfügbaren Sprache schreiben und nur sicherstellen, dass es das ausführbare Flag hat.

Sie können also einen Python oder Go-Code schreiben, um Ihre Ziele zu erreichen, und diesen unter dem Hooks-Ordner ablegen. Er funktioniert, wird jedoch nicht zusammen mit dem Repository verwaltet.

Zwei Optionen

a) Mehrere Skripte

Sie können Ihre Hooks in Ihrer Hilfe codieren und Hooks ein kleines Codefragment hinzufügen, um Ihr perfektes Skript wie folgt aufzurufen:

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

b) Einzelskript

Eine coolere Option ist, nur ein Skript hinzuzufügen, um sie alle zu beherrschen, anstatt mehrere. Also erstellen Sie eine hooks/mysuperhook.go und zeigen auf jeden Hook, den 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 unterscheiden. Warum? Manchmal möchten Sie zum Beispiel die gleiche Prüfung für Festschreiben und Push ausführen.

Und dann?

Dann möchten Sie vielleicht weitere Funktionen haben, wie zum Beispiel:

  • Lösen Sie den Haken manuell aus, um zu überprüfen, ob alles in Ordnung ist, auch vor einem Commit oder Push. Wenn Sie nur Ihr Skript aufrufen (Option a oder b) würde dies den Trick tun.
  • Triggern Sie die Hooks für CI, damit Sie nicht dieselben Prüfungen für CI erneut schreiben müssen, sondern zum Beispiel nur die Auslöser commit und Push aufrufen. Das gleiche wie oben sollte es lösen.
  • Rufen Sie externe Tools wie einen Markdown-Validator oder einen YAML-Validator auf. Sie können Syscalls erstellen und müssen mit STDOUT und STDERR umgehen.
  • Stellen Sie sicher, dass alle Entwickler eine einfache Möglichkeit haben, die Hooks zu installieren, sodass ein Nice-Skript zum Repository hinzugefügt werden muss, um die Standard-Hooks durch die richtigen zu ersetzen
  • Haben Sie einige globale Helfer, z. B. einen Check zum Blockieren von Commits, um Zweige zu entwickeln und zu verwalten, und müssen Sie ihn nicht jedem Repository hinzufügen. Sie können es lösen, indem Sie ein anderes Repository mit globalen Skripten haben.

Kann das einfacher sein?

Ja, es gibt verschiedene Tools, mit denen Sie Git-Hooks verwalten können. 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 zu finden. GitHooks.com bietet eine Menge Informationen zum Thema Hooking und verschiedene Tools, die heute verfügbar sind.

Derzeit sind dort 21 Projekte mit unterschiedlichen Strategien zur Verwaltung von Git-Hooks aufgeführt. Einige tun dies nur für einen einzelnen Hook, andere für eine bestimmte Sprache und so weiter.

Eines dieser von mir geschriebenen und als Open Source-Projekt kostenlos angebotenen Tools heißt hooks4git . Es ist in Python (weil es mir gefällt) geschrieben, aber die Idee ist, alle oben aufgelisteten Elemente in einer einzigen Konfigurationsdatei namens .hooks4git.ini zu behandeln, die sich in Ihrem Repository befindet und jede beliebige Datei aufrufen kann Skript, das Sie aufrufen möchten, in einer beliebigen Sprache.

Git Hooks zu verwenden ist absolut fantastisch, aber die Art und Weise, wie sie angeboten werden, bringt normalerweise nur Leute davon weg.

0
Lovato

pre-commit macht dies für Pre-Commit-Hooks einfach. Beantwortet nicht die Frage des OP zum Verwalten von beliebigen Git-Hooks, aber Pre-Commit-Hooks werden wahrscheinlich am häufigsten für Zwecke der Codequalität verwendet.

0
ericsoco