Anwenden eines Git-Post-Commit-Hooks auf alle aktuellen und zukünftigen Repos

275

Ich habe einen Git-Post-Commit-Hook geschrieben und er funktioniert korrekt. Ich möchte diesen Hook jedoch hinzufügen, um ihn auf alle aktuellen (und zukünftigen) Git-Repositorys anzuwenden, an denen ich arbeite. Ich habe versucht, den Hook zu meinem ~/.git/hooks/anstatt im Hooks-Verzeichnis im Projektverzeichnis hinzuzufügen , dies schien jedoch nicht zu funktionieren.

Gibt es eine Möglichkeit, globale Git-Hooks zu erstellen, die für alle Repositorys auf meinem System gelten (ohne sie in jedes Projektverzeichnis kopieren zu müssen)? Wenn nicht, was wäre die beste Lösung für die Zukunft - vielleicht eine Git-Init-Vorlage?

Swanson
quelle
3
Ab Git 2.9 hat sich dieser beste Ansatz geändert: VonCs Antwort ist eine bessere Wahl. stackoverflow.com/a/37293198/2741954
Simon Brahan
Beantwortet das deine Frage? Standard-Git-Hooks ändern
Oliver Sieweke

Antworten:

192

Ich möchte diesen Hook hinzufügen, um ihn auf alle aktuellen (und zukünftigen) Git-Repositorys anzuwenden, an denen ich arbeite

Mit git 2.9+ (Juni 2016) würden Sie nur Folgendes tun:

git config --global core.hooksPath /path/to/my/centralized/hooks

Siehe " Standard-Git-Hooks ändern ": Dies wurde durchgeführt, um zentralisierte Hooks zu verwalten.

VonC
quelle
Wenn ich ein bestehendes Repo habe und möchte, dass alle anderen Entwickler, die Änderungen vornehmen, einen aktualisierten Pre-Commit-Hook haben, wie würde ich das tun? Vielen Dank
Richlewis
@Richlewis meinst du stackoverflow.com/a/40550555/6309 war nicht ganz klar?
VonC
@Richlewis Sie müssten einen freigegebenen Ordner einrichten, auf den alle Entwickler zugreifen können, damit sie in ihrer eigenen lokalen Konfiguration darauf verweisen können.
VonC
Leider verstehe ich es immer noch nicht ganz. /.git/hooks/pre_commitKann ich innerhalb des Repos darauf hinweisen?
Richlewis
@Richlewis Ich habe dir auf deine ursprüngliche Frage geantwortet.
VonC
290

Ab Git 1.7.1 können Sie init.templatedir in Ihrer gitconfig festlegen, um git mitzuteilen, wo nach Vorlagen gesucht werden soll.

Stellen Sie es so ein:

git config --global init.templatedir '~/.git_template'

Anschließend verwenden neue Repositorys, die Sie erstellen oder klonen, dieses Verzeichnis für Vorlagen. Platzieren Sie die gewünschten Haken ~/.git_template/hooks. Bestehende Repositorys können mit den richtigen Vorlagen neu initialisiert werden, indem sie git initim selben Verzeichnis ausgeführt .gitwerden, in dem sie sich befinden.

Bei Git-Versionen, die älter als 1.7.1 sind, git init --template ~/.git_templatefunktioniert das Ausführen , wenn Sie wie ich sind und Ihr .git_templateVerzeichnis zusammen mit den übrigen Punktedateien verwalten möchten . Sie können auch die $GIT_TEMPLATE_DIRUmgebung verwenden, um festzustellen, git initwo sich Ihr Vorlagenverzeichnis befindet.

sklnd
quelle
51
Gute Antwort. Wenn sich jemand fragt, ob ein erneutes Ausführen git initeines vorhandenen Repos es
löscht
Für mich funktionierte es nicht mit dem relativen Pfad zum Git-Vorlagenordner zum Kopieren von Dateien mit Git-Init in vorhandene Repositorys. Ich hatte stattdessen den vollständigen Pfad verwendet.
user847988
1
Unter Windows ohne Anführungszeichen: `git config --global init.templatedir d: \ git \ .git_template \`
Vladimir Vukanac
1
Tipp: Die Vorlagen-Hooks werden kopiert. Wenn Sie die globalen Hooks zusammen aktualisieren möchten, platzieren Sie den Hook an einer anderen Stelle und fügen Sie einen symbolischen Link in das Vorlagenverzeichnis ein (unter Linux). Stellen Sie sicher, dass der Linkpfad absolut ist.
Tim Allclair
1
Beim Laufen wurden git initdie Hooks für mich nicht aktualisiert. Es scheint, dass bereits vorhandene Dateien nicht überschrieben werden. stackoverflow.com/questions/10791486/ . Stattdessen müssen Sie zuerst die alten Hook-Dateien entfernen.
Phil R
69

Wenn Sie sie überall auf Ihrem System haben möchten (einschließlich der Benutzer neben Ihnen), können Sie den Inhalt des installierten Vorlagenverzeichnisses ändern - diese befinden sich dort $PREFIX/share/git-core/templates/hooks, wo $PREFIXwahrscheinlich /usr/localoder /usr.

Wenn Sie möchten, dass dies nur für Sie ist, dann ist die einfachste Sache die --templateOption von git-init. Sie können problemlos ein persönliches Vorlagenverzeichnis behalten, das Symlinks zu der installierten Version der Standardeinstellungen enthält, die Sie beibehalten möchten (einzelne Hooks, das Info-Verzeichnis ...), und dann Ihren eigenen Inhalt hooks/post-commitund alles andere, was Sie anpassen möchten.

Cascabel
quelle
11
Danke, das hat gut geklappt. Und um es rückwirkend auf meine bestehenden Projekte anzuwenden, habe ich es einfach git initerneut ausgeführt und meinen neuen Hook hinzugefügt.
Swanson
Dies ist eine nette Problemumgehung, aber es würde erfordern, dass Sie alle Ihre Repos ändern. Dies ist machbar, aber gibt es keine Möglichkeit mit einem Plugin oder so etwas (so wird es bei Bazaar gemacht)?
Martin Ueding
2
Für SourceTrees Embedded Git unter OS X sind sie in/Applications/SourceTree.app/Contents/Resources/git_local/share/git-core/templates/hooks
CupawnTae
1
Für Windows befindet sich dies im Git-Installationsverzeichnis unter mingw64\share\templates\hooks(oder mingw32 für 32-Bit)
Nerdherd
1
@nerdherd es ist jetzt bei mingw64\share\git-core\templates\hooks(gfw 2.25)
RJFalconer
7

Ein minimalistischer Ansatz besteht darin, ein git_hooks/Verzeichnis in Ihrem Repository zu erstellen , um die Hooks zu verfolgen, die Sie für dieses Projekt schreiben, zukünftige Benutzer darauf aufmerksam zu machen, indem Sie es in a erwähnen README, und sich darauf zu verlassen, dass sie nach dem Klonen das Richtige tun. Ich habe eine Weile darüber nachgedacht und einen inkrementellen Ansatz gewählt. Auf der anderen Seite könnte ich ein Werkzeug wie Git-Hooks verwenden .

Neil Best
quelle
1
Dies ist so weit davon entfernt, eine echte Lösung zu sein, dass ich abstimmen musste, sorry.
Victor Schröder