2010-01-26 4 views
23

Selon le manuel, le post-checkout crochet est exécuté après un git checkout (comme prévu), mais aussi après un git clone (sauf si vous passez --no-checkout).crochet git-clone et post-checkout

Très bien, maintenant, compte tenu de ce qui suit:

  • vous n'avez pas un dépôt local avant un git clone
  • crochets ne sont pas synchronisés entre les télécommandes
  • crochets stockés dans un répertoire de modèle personnalisé utilisé avec --template sont copiés non exécutables et donc pas exécuté après git clone (ce qui n'est pas vrai comme indiqué par Jefromi dans sa réponse, mais le crochet est toujours non exécuté)

Il semble impossible qu'un point post-checkout soit jamais exécuté après un git clone. Pourtant, la page de manuel githooks à http://git-scm.com/docs/githooks indique explicitement un moyen d'éviter son exécution, ainsi que les paramètres passés au cas où il est exécuté, ce qui indiquerait qu'il est possible d'exécuter un hook personnalisé après un git-clone.

Alors, comment est-ce possible? Il me manque évidemment quelque chose ici.

Turns out

+0

Quelle est la sortie de 'git --version'? –

+0

Voir ma réponse pour la dépendance de version! – Cascabel

Répondre

14

Je suppose que vous pourriez faire une installation personnalisée - renommer les crochets .../share/git-core/templates/hooks pour enlever le suffixe .sample.

Vous pouvez également créer un répertoire de modèles contenant des liens symboliques vers un répertoire hooks à l'intérieur du référentiel (par exemple post-checkout -> ../../hooks/post-checkout). Ensuite, si le repo cloné contenait ce hook particulier, il serait exécuté.

Vous avez raison, cependant, dans la plupart des cas, cela n'arrivera pas. Editer: Je viens de le tester, et l'option --template semble conserver les permissions, donc c'est un moyen beaucoup plus simple de le faire. Qu'avez-vous vu pour indiquer que cela a été retiré?

Le dernier mot sur les versions: Vous consultez la documentation en ligne pour une version plus récente de git que celle que vous utilisez. Cette fonctionnalité a été ajoutée dans dfa7a6c (clone: ​​exécute le hook post-checkout lors de la vérification); git description dit que ce n'était pas inclus jusqu'à v1.6.2-rc2.

+0

Juste, je viens de tester, et il s'avère qu'ils sont effectivement copiés avec le bit exécutable (je ne sais pas pourquoi je pensais qu'il a été dépouillé, doit avoir lu quelque part sur Internet). Le hook n'est toujours pas exécuté, c'est bizarre parce que si je fais un 'git checkout 'juste après le' git clone', il est exécuté correctement. Quelle version de git avez-vous? J'utilise 1.6.0.4 ici. J'ai posté la procédure exacte utilisée dans un sens: http://gist.github.com/287084 –

+0

Aussi, j'ai juste testé mettre le crochet dans '/ usr/share/git-core/template' et il produit le même résultat –

+1

J'ai fait un test rapide avec 'clone --template' - un hook post-checkout exécutable est définitivement exécuté pour moi. J'utilise la version actuelle de git.git (en ce moment, git 1.7.0.rc0.8.ge3f67d). Je ne suis pas le seul sur mon système actuel, donc essayer avec des versions plus anciennes devrait attendre plus tard. – Cascabel

8

De l'githooks documentation:

Lorsque git-init est exécuté, une poignée d'exemple des crochets sont copiés dans le répertoire hooks du nouveau référentiel, mais par défaut, ils sont désactivés. Pour activer un hook, renommez-le en supprimant son suffixe .sample.

Cette initialisation a lieu dans le cadre de la création d'un clone de noter l'appel à init_db en builtin-clone.c.

Par exemple:

$ cat /tmp/my-git-template/hooks/post-checkout 
#! /bin/bash 
echo "Hello from $0" 

$ git clone --template=/tmp/my-git-template file:///tmp/repo.git my-clone 
Initialized empty Git repository in /tmp/my-clone/.git/ 
remote: Counting objects: 3, done. 
remote: Total 3 (delta 0), reused 0 (delta 0) 
Receiving objects: 100% (3/3), done. 
Hello from .git/hooks/post-checkout
+1

La documentation ici parle plutôt de l'activer dans votre propre référentiel, et l'OP en est évidemment conscient. Bien sûr, vous pouvez supprimer le suffixe des modèles dans le répertoire d'installation (ce qui est exactement ce que j'ai déjà posté). – Cascabel

+0

Donc, cela fonctionne aussi bien avec le vôtre - soit l'OP a fait une bêtise dans les tests, ou un bug a été corrigé depuis la version 1.6.0 - puisque vous liez la source, je suppose que vous utilisez une nouvelle version? – Cascabel

+0

Je cours 1.6.5.5. J'ai accès à une autre boîte avec 1.5.5.6 qui copie le hook et retient les bits d'exécution mais ne semble pas l'exécuter. –