Appliquer un hook git post-commit à tous les repos actuels et futurs

275

J'ai écrit un hook post-commit Git et cela fonctionne correctement. Cependant, je veux ajouter ce hook pour s'appliquer à tous les dépôts git actuels (et futurs) sur lesquels je travaille. J'ai essayé d'ajouter le crochet à mon ~/.git/hooks/au lieu de dans le répertoire des crochets dans le répertoire du projet, mais cela ne semble pas fonctionner.

Existe-t-il un moyen de créer des hooks Git globaux qui s'appliqueront à tous les référentiels de mon système (sans avoir à les copier dans chaque répertoire de projet)? Sinon, quelle serait la meilleure solution à l'avenir - peut-être un modèle git-init?

Swanson
la source
3
Depuis Git 2.9, cette meilleure approche a changé: la réponse de VonC est un meilleur pari. stackoverflow.com/a/37293198/2741954
Simon Brahan
Est-ce que cela répond à votre question? changer les crochets git par défaut
Oliver Sieweke

Réponses:

192

Je veux ajouter ce hook pour l'appliquer à tous les dépôts git actuels (et futurs) sur lesquels je travaille

Avec git 2.9+ (juin 2016), tout ce que vous feriez serait de:

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

Voir " changer les hooks git par défaut ": cela a été fait pour gérer les hooks centralisés.

VonC
la source
si j'ai un dépôt existant et que je veux que tous les autres développeurs qui tirent les modifications aient un hook de pré-validation mis à jour, par exemple, comment puis-je faire cela? merci
Richlewis
@Richlewis voulez-vous dire que stackoverflow.com/a/40550555/6309 n'était pas complètement clair?
VonC
@Richlewis Vous auriez besoin de configurer un dossier partagé accessible par tous les développeurs, pour qu'ils puissent référencer dans leur propre configuration locale.
VonC
malheureusement je ne comprends toujours pas très bien. au sein du repo, /.git/hooks/pre_commitpuis-je le signaler?
Richlewis
@Richlewis Je vous ai répondu sur votre question d'origine.
VonC
290

Depuis git 1.7.1, vous pouvez définir init.templatedir dans votre gitconfig pour indiquer à git où chercher les modèles.

Réglez-le comme ceci:

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

Par la suite, les nouveaux référentiels que vous créez ou clonez utiliseront ce répertoire pour les modèles. Placez les crochets que vous souhaitez ~/.git_template/hooks. Les référentiels existants peuvent être réinitialisés avec les modèles appropriés en s'exécutant git initdans le même répertoire que celui .gitde.

Pour les versions git antérieures à 1.7.1, l'exécution git init --template ~/.git_templatefonctionnera si vous êtes comme moi et que vous souhaitez toujours gérer votre .git_templaterépertoire avec le reste de vos fichiers dot. Vous pouvez également utiliser l' $GIT_TEMPLATE_DIRenvironnement pour indiquer git initoù se trouve votre répertoire de modèles.

sklnd
la source
51
Très bonne réponse. Si quelqu'un d'autre se demande si la git init
réexécution
Pour moi, cela ne fonctionnait pas avec le chemin d'accès relatif au dossier de modèles git pour copier des fichiers à l'aide de git init sur des référentiels existants. J'ai dû utiliser le chemin complet à la place.
user847988
1
Sur les fenêtres sans citation: `git config --global init.templatedir d: \ git \ .git_template \`
Vladimir Vukanac
1
Conseil: les crochets du modèle sont copiés. Si vous voulez pouvoir mettre à jour les hooks globaux ensemble, placez le hook ailleurs et ajoutez un lien symbolique dans le répertoire des modèles (sous Linux). Assurez-vous que le chemin du lien est absolu.
Tim Allclair
1
La course git initn'a pas vraiment mis à jour les crochets pour moi. Il semble qu'il n'écrase pas les fichiers qui s'y trouvent déjà. stackoverflow.com/questions/10791486/ . Au lieu de cela, vous devez d'abord supprimer les anciens fichiers de hook.
Phil R
69

Si vous les voulez partout sur votre système (y compris les utilisateurs en plus de vous), vous pouvez modifier le contenu du répertoire de modèles installé - ceux-ci se trouvent $PREFIX/share/git-core/templates/hooks, où $PREFIXest probablement /usr/localou /usr.

Si vous voulez que ce soit juste pour vous, alors oui, la chose la plus simple serait l' --templateoption de git-init. Vous pouvez facilement conserver un répertoire de modèles personnel contenant des liens symboliques vers la version installée des valeurs par défaut que vous souhaitez conserver (crochets individuels, répertoire d'informations ...), puis votre propre contenu hooks/post-commitet tout ce que vous souhaitez personnaliser.

Cascabel
la source
11
Merci, cela a bien fonctionné. Et pour l'appliquer rétroactivement à mes projets existants, je viens de courir à git initnouveau et il a ajouté mon nouveau crochet.
swanson
C'est une solution de contournement intéressante, mais cela nécessiterait que vous changiez tous vos dépôts. C'est faisable, mais n'y a-t-il pas une possibilité avec un plugin ou quelque chose (c'est comme ça que ça se fait chez Bazaar)?
Martin Ueding
2
Pour git intégré de SourceTree sur OS X, ils sont dans/Applications/SourceTree.app/Contents/Resources/git_local/share/git-core/templates/hooks
CupawnTae
1
Pour Windows, cela se trouve dans le répertoire d'installation de git sous mingw64\share\templates\hooks(ou mingw32 pour 32 bits)
nerdherd
1
@nerdherd c'est maintenant au mingw64\share\git-core\templates\hooks(gfw 2.25)
RJFalconer
7

Une approche minimaliste consiste à créer un git_hooks/répertoire dans votre référentiel pour suivre les crochets que vous écrivez pour ce projet, le porter à l'attention des futurs utilisateurs en le mentionnant dans un README, et compter sur eux pour faire la bonne chose après leur clonage. J'ai réfléchi à cela pendant un certain temps et j'ai choisi une approche progressive. Sur la route, je pourrais envisager d'utiliser un outil comme les git-hooks .

Neil Best
la source
1
Il en est ainsi, si loin d'être une vraie solution que j'ai dû déprécier, désolé.
Victor Schröder