obtenir «fatal: not a git repository: '.'» lors de l'utilisation du hook post-update pour exécuter 'git pull' sur un autre dépôt

89

Je suis nouveau dans git, alors je m'excuse (et corrigez-moi s'il vous plaît) si j'utilise mal la terminologie ici, mais je ferai de mon mieux.

J'essaie de mettre en place un repo nu git (hub) et une copie de travail du site de développement (prime) sur un serveur Web. J'ai essayé de le modeler après cet article . Je souhaite que la copie de travail de développement soit mise à jour chaque fois que le repo hub est poussé vers. J'ai l'impression que le crochet approprié pour cela est post-update, que j'ai créé comme ceci:

#!/bin/sh
whoami
cd /path/to/working-copy/
RET=`git pull`
echo $RET

Mettre à jour

Lorsque je transmets les modifications de mon dépôt local au hub nu, j'obtiens la sortie suivante du script de post-mise à jour:

remote: sites
remote: fatal: Not a git repository: '.'

Cependant, si je SSH sur le serveur en tant que «sites» d'utilisateurs et que j'exécute ce script manuellement, cela fonctionne très bien. Des idées sur ce qui pourrait ne pas aller avec ce hook ou ce script?

Ty W
la source

Réponses:

179

Voici le script qui a finalement fonctionné. Je pense que l'élément qui me manquait à l'origine et qui l'empêchait de fonctionner à distance était leunset GIT_DIR

#!/bin/sh
cd /path/to/working-copy/ || exit
unset GIT_DIR
git pull repo branch

exec git-update-server-info
Ty W
la source
18
Je peux confirmer, la désactivation GIT_DIRrésout le problème.
jmtd
16
Pour ceux qui veulent comprendre pourquoi: c'est parce que git utilise la variable GIT_DIRau lieu de PWD. cd-ing change le PWDpas le GIT_DIR. Il doit y avoir une solution de secours dans git de GIT_DIRà PWDsi le premier n'est pas disponible.
zupa
La question est de savoir pourquoi git doit-il voir nécessaire de faire cela pour le script hook (définissez GIT_DIR pour que même le script ait 'cd' ailleurs 'git what' fonctionnera toujours)? Personnellement, j'opterais pour que git ne fasse pas ce genre de magie.
Steven Haryanto
2
La raison derrière cela est que Git applique certaines variables d'environnement à toutes les commandes git principales.
Casey
Que se passe-t-il après un conflit de fusion git pull?
lolololol ol
29

Essayez plutôt:

#!/bin/sh
cd /path/to/working-copy/
env -i git pull
Geraldo Luis da Silva Ribeiro
la source
0

Malgré cela, GIT_DIR ne fonctionne pas.

le problème se produit lorsque vous définissez GIT_DIR incorrectement ailleurs.

vous pouvez simplement ajouter cela à la place: GIT_DIR = .git / Cela fonctionnera

Zvika Naveh
la source
0

Dans mon cas, j'avais spécifié un arbre de travail, et cela casse sur certaines commandes, comme pull(ou plus précisément fetch).

Pour désactiver l'arborescence de travail si elle est dans votre configuration git, utilisez:

git config --unset core.worktree

(Il existe d'autres façons de définir un arbre de travail)

Important à noter,

Il n'y a pratiquement aucun changement de ce problème, à moins que vous n'ayez creusé vous-même ce trou autour de vous en utilisant un arbre de travail personnalisé en premier lieu.

Plaisanter:

Cela m'implique que les internes de git utilisent des chemins relatifs à l'arbre de travail + .git/dans certains cas. D'après mon expérience, les arbres de travail ne sont pas du tout supportés, sauf par les parties les plus fondamentales de git. Je n'ai pas expérimenté à fond, Git se comporterait probablement si je définissais correctement la variable de configuration du répertoire git, avec laquelle je n'ai pas joué.

ThorSummoner
la source
-1

Vous avez probablement un problème d'autorisations. Je ne sais pas comment vous avez configuré votre repo nu git, mais s'il s'exécute sous l' gitutilisateur, assurez-vous que l' gitutilisateur est autorisé à effectuer le git pulldans votre répertoire de projet.

Essayez éventuellement ceci pour savoir quel utilisateur vous êtes lorsque le hook est exécuté:

echo `whoami`
Ariéjan
la source
si je ssh dans le serveur en tant qu'utilisateur git, je peux utiliser git pull dans mon répertoire de projet sans problème. Je crois que c'est l'utilisateur qui devrait exécuter le script. Je peux essayer d'ajouter la ligne whoami au script, mais où va la sortie de ce script lorsqu'il est exécuté en tant que hook? Peut-être que j'ai besoin d'envoyer cette sortie dans un fichier journal au lieu de faire écho?
Ty W
Qu'est- echo `whoami`ce que whoamicela ne fait pas?
Christoffer Hammarström
La sortie vers stdout à partir d'un script de hook est visible par la télécommande effectuant l'action. Ou, en d'autres termes, si vous dites 'git push', la sortie d'un hook sur la télécommande apparaîtra dans votre stdout.
ebneter
ouais, j'ai remarqué que je jouais avec des trucs. très pratique :)
Ty W