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?

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

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


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


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é.


-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`

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.