2010-02-19 4 views
211

J'ai écrit un hook Git post-commit et cela fonctionne correctement. Cependant, je veux ajouter ce crochet pour l'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 de crochets dans le répertoire de projet, cependant, cela n'a pas semblé fonctionner.Git commit hooks - paramètres globaux

Est-il possible de créer des hooks Git globaux qui s'appliqueront à tous les dépôts 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 git-init template?

+3

À partir de Git 2.9, la meilleure approche a changé: la réponse de VonC est un meilleur pari. http://stackoverflow.com/a/37293198/2741954 –

Répondre

81

Je veux ajouter ce crochet à appliquer à tous les référentiels git actuels (et futurs) Je travaille sur

Avec git 2.9+ (Juin 2016), tout ce que vous feriez est:

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

Voir "change default git hooks": ceci a été fait pour gérer des crochets centralisés.

+0

si j'ai un repo existant et je veux que tous les autres dev qui tirent des changements aient un hook pré-commit mis à jour par exemple comment je ferais ça? merci – Richlewis

+0

@Richlewis voulez-vous dire http://stackoverflow.com/a/40550555/6309 n'était pas complètement clair? – VonC

+0

@Richlewis Vous auriez besoin de configurer un dossier partagé accessible par tous les développeurs, pour qu'ils puissent se référer dans leur propre configuration locale. – VonC

67

Si vous le souhaitez partout sur votre système (y compris les utilisateurs en dehors de vous), vous pouvez modifier le contenu du répertoire de modèles installés - ceux qui sont dans $PREFIX/share/git-core/templates/hooks, où $PREFIX est probablement /usr/local ou /usr.

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

+11

Merci, cela a bien fonctionné. Et pour l'appliquer rétroactivement à mes projets existants, j'ai juste couru 'git init' encore et il a ajouté mon nouveau crochet. – swanson

+1

Merveilleux pourboire Jefromi, merci beaucoup! –

+0

Il s'agit d'une solution de contournement soignée, mais cela nécessiterait que vous modifiez tous vos repos. C'est faisable, mais n'y at-il pas une possibilité avec un plugin ou quelque chose (c'est comme ça que ça se fait chez Bazaar)? –

268

A partir de git 1.7.1, vous pouvez définir init.templatedir dans votre gitconfig pour indiquer à git où rechercher des modèles.

Set comme ceci:

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

Ensuite, de nouveaux dépôts que vous créez ou clone utilisera ce répertoire pour les modèles. Placez les crochets que vous voulez dans ~/.git_template/hooks. référentiels existants peuvent être réinitialisés avec les modèles appropriés en exécutant git init dans le même répertoire .git est dans.

Pour les versions git de plus de 1.7.1, en cours d'exécution git init --template ~/.git_template fonctionnera si vous êtes comme moi et que vous voulez toujours gérer .git_template dir avec le reste de vos fichiers de points. Vous pouvez également utiliser l'environnement $GIT_TEMPLATE_DIR pour indiquer git init où se trouve votre répertoire de modèles.

+1

gérer des hooks git avec des fichiers point est une bonne idée. Merci. –

+47

Bonne réponse. Si quelqu'un d'autre se demande si re-running 'git init' sur un repo existant l'efface - ** ça ne fonctionne pas **, voir: http://stackoverflow.com/questions/5149694/does-running-git-init-twice -initialize-a-repository-or-reinitialize-an-existing – kontur

+0

Pour moi, cela ne fonctionnait pas avec le chemin relatif au dossier git template pour copier des fichiers en utilisant git init sur des dépôts existants. J'avais utilisé le chemin complet à la place. – user847988

3

Une approche minimaliste est de créer un répertoire git_hooks/ dans votre référentiel pour suivre les crochets que vous écrivez pour ce projet, porter à l'attention des futurs utilisateurs en mentionnant dans un README, et compter sur eux pour faire la bonne chose après qu'ils ont cloné. 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 git-hooks.