web-dev-qa-db-fra.com

Comment exécuter une commande juste après une commande fetch ou pull dans git?

J'ai cloné le référentiel GHC (Glasgow Haskell Compiler). Pour construire le compilateur, vous avez besoin de plusieurs bibliothèques, toutes disponibles en tant que référentiels git. Afin de faciliter la vie, les pirates du GHC ont inclus un script sync-all qui, une fois exécuté, met à jour tous les référentiels dépendants.

Passons maintenant à ma question: comment puis-je faire exécuter git ./sync-all pull après avoir fait un git pull automatiquement? J'ai entendu quelque chose sur l'utilisation des crochets, mais je ne sais pas vraiment ce que je dois faire.

31
fuz

Si vous devez exécuter un script après un git pull côté client (votre machine), alors a il n'y a pas de solution fiable.

Le hook côté client post-fusion ( mentionné ici ) ne sera pas déclenché par chaque pull (par exemple, pas dans un pull rebase, pas en cas de fast- fusion avant)

Un alias encapsulant les deux commandes reste donc une solution de contournement possible.


Réponse originale (2011)

Si vous en avez besoin du côté serveur, où vous extrairiez le référentiel nu et extrairiez d'une arborescence de travail (sur le serveur) après chaque Push vers un référentiel nu (sur le serveur):

A post-receive ou post-update hook est généralement utilisé pour ce type de tâche, exécutée après chaque Push.
La différence entre les crochets post-receive et post-update est dans les arguments: a post-receive obtiendra à la fois l'ancienne et la nouvelle valeur de toutes les références en plus de leurs noms.

La pièce manquante est: où ce hook s'exécute?

Le billet de blog " Manque de documentation sur les hooks git " de (un excellent) SO contributor Mark Longair éclaire un peu ce sujet:

le répertoire de travail actuel sera le répertoire git .

  • Donc, s'il s'agit d'un dépôt nu appelé "/src/git/test.git/ ", Ce sera le répertoire de travail actuel - s'il s'agit d'un référentiel non nu et que le niveau supérieur de l'arborescence de travail est" /home/mark/test/ "Alors le répertoire de travail actuel sera" /home/mark/test/.git/ "

Chris Johnsen détails dans sa réponse SO : "Si –-git-dir ou GIT_DIR sont spécifiés mais aucun des -–work-tree, GIT_WORK_TREE et core.worktree est spécifié, le répertoire de travail actuel est considéré comme le répertoire supérieur de votre arbre de travail. "

En d'autres termes, votre arbre de travail sera également le répertoire courant (le .git " répertoire), ce qui n'est certainement pas ce que vous voulez.

Assurez-vous que votre hook/post-receive script, une fois créé et rendu exécutable, définit le GIT_WORK_TREE sur le bon chemin, pour que votre ./sync-all pull à exécuter dans le bon répertoire (c'est-à-dire pas "xxx.git" une).

27
VonC

Lorsque vous exécutez git pull, git fait en fait une extraction suivie d'une fusion. Cela signifie que vous pouvez utiliser le post-merge hook pour exécuter un script lorsqu'une extraction est terminée.

Pour configurer cela, il vous suffit de créer un script exécutable dans .git/hooks/ répertoire appelé post-merge.

Notez que ce script ne sera pas exécuté si la fusion échoue en raison de conflits.

16
nullability