2010-08-22 3 views
16

J'ai un gop repo central mis en place en utilisant la gitolite.Appel de 'git pull' à partir d'un git post-update hook

Je souhaite configurer un hook de sorte que chaque fois qu'un utilisateur appuie sur le repo, il effectue un pull ailleurs suivi de tests automatisés.

Jusqu'à présent, je veux seulement effectuer la traction.

Dans le répertoire de crochets j'ai créé les noms de script suivants post-mise à jour:

#!/bin/sh 
cd /home/git/www/epicac 
git pull 

Quand j'invoque ce script en utilisant ./post-update, il fait exactement ce que je veux. Cependant, à chaque fois que je l'appelle automatiquement, je reçois: fatal: Pas de dépôt git: '.'

Une idée pourquoi cela pourrait-il se produire?

+2

venons d'ajouter la solution git 'env -i pull'. – VonC

+0

ont exactement le même problème, même après 7 ans –

Répondre

25

Vous avez plusieurs diagnostics pour exécuter comme suggéré dans ce SO answer. En particulier, check out the the value of GIT_DIR and GIT_WORK_TREE.

Alors que le crochet est en cours d'exécution, et GIT_DIR (si le worktree ne peut être déduit de GIT_DIR) GIT_WORK_TREE sont définies.
Cela signifie que votre extraction ne fonctionnera pas avec le référentiel dans le répertoire que vous avez modifié.


Voir son blog aussi après Using Git Inside a Git Hook:

Finalement, nous avons obtenu notre gourou linux sur et il a remarqué que l'environnement dans lequel fonctionne l'utilisateur git est totalement différent lorsque l'intérieur d'un crochet.
Gitolite fait un tas de choses à l'env, mais celui qui nous baisait était le réglage du GIT_DIR.
Après compris cela, la solution était aussi simple que:

ENV.delete 'GIT_DIR' 

dans notre script Ruby qui est déclenché par le crochet 'post-receive'.


deal Même dans Git Tip: Auto update working tree via post-receive hook, mais avec une façon élégante de ceci:

La solution?
Il se trouve le crochet post-receive commence avec la variable d'environnement GIT_DIR défini sur le dossier repo/.git, donc peu importe ce chemin que vous « cd » en elle essaiera toujours d'exécuter des commandes git suivantes il.
Fixation ceci est simplement une question de Décharger le GIT_DIR
(grâce à Ulrich Petri pour la élégante solution env -i):

#!/bin/sh 
cd .. 
env -i git reset --hard 
7

Que diriez-vous préciser le --git-dir.

#!/bin/sh 
cd /home/git/www/epicac 
git --git-dir=.git pull 
0

Cela devrait faire l'affaire en une seule ligne:

git -C /home/git/www/epicac pull 
Questions connexes