uzyskiwanie „fatal: not a git repository: '.'” podczas korzystania z haka po aktualizacji do wykonania polecenia „git pull” na innym repozytorium

90

Jestem nowy, więc przepraszam (i popraw mnie), jeśli nadużyję tutaj terminologii, ale zrobię co w mojej mocy.

Próbuję skonfigurować gołe repozytorium git (hub) i kopię roboczą witryny programistycznej (podstawową) na serwerze sieci Web. Próbowałem to wzorować na tym artykule . Chcę, aby kopia robocza deweloperska była aktualizowana za każdym razem, gdy repozytorium centrum jest wypychane. Mam wrażenie, że odpowiedni do tego haczyk to taki post-update, który stworzyłem tak:

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

Aktualizacja

Kiedy wypycham zmiany z mojego lokalnego repozytorium do samego centrum, otrzymuję następujące dane wyjściowe ze skryptu po aktualizacji:

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

Jeśli jednak zaloguję się do serwera jako „witryny” użytkownika i wykonam ten skrypt ręcznie, to działa świetnie. Jakieś pomysły, co może być nie tak z tym punktem zaczepienia lub skryptem?

Ty W
źródło

Odpowiedzi:

179

Oto scenariusz, który ostatecznie zadziałał. Myślę, że tym, czego początkowo brakowało, a który uniemożliwił mu zdalną pracę, był plikunset GIT_DIR

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

exec git-update-server-info
Ty W
źródło
18
Mogę potwierdzić, rozbrojenie GIT_DIRrozwiązuje problem.
jmtd
16
Dla tych, którzy chcą, rozumieją dlaczego: to dlatego, że git używa zmiennej GIT_DIRzamiast PWD. cd-ing zmienia PWDnie GIT_DIR. W git musi istnieć rezerwa od GIT_DIRdo, PWDjeśli pierwszy nie jest dostępny.
zupa
Pytanie brzmi, dlaczego git musi widzieć, że konieczne jest zrobienie tego dla skryptu przechwytującego (ustaw GIT_DIR tak, aby nawet skrypt miał gdzie indziej 'cd' 'git cokolwiek' nadal będzie działał)? Osobiście wybrałbym, że git nie robi tego rodzaju magii.
Steven Haryanto
2
Powodem tego jest to, że Git stosuje pewne zmienne środowiskowe do wszystkich podstawowych poleceń git.
Casey
Co się dzieje, gdy następuje konflikt scalania git pull?
lolololol ol
29

Spróbuj zamiast tego:

#!/bin/sh
cd /path/to/working-copy/
env -i git pull
Geraldo Luis da Silva Ribeiro
źródło
0

Pomimo tego nieustawionego GIT_DIR po prostu działa.

problem występuje, gdy ustawisz GIT_DIR nieprawidłowo w innym miejscu.

możesz po prostu to dodać: GIT_DIR = .git / To będzie działać

Zvika Naveh
źródło
0

W moim przypadku określiłem drzewo robocze, które zrywa się w przypadku niektórych poleceń, takich jak pull(lub dokładniej fetch).

Aby usunąć drzewo robocze, jeśli jest w konfiguracji git, użyj:

git config --unset core.worktree

(Istnieją inne sposoby ustawienia drzewa roboczego)

Ważna uwaga,

Nie ma prawie żadnej zmiany w twoim problemie, chyba że sam wykopiesz tę dziurę wokół siebie, używając przede wszystkim niestandardowego drzewa roboczego.

Drażnić:

To sugeruje mi, że .git/w niektórych przypadkach wewnętrzne elementy git używają ścieżek względem drzewa roboczego + . Z mojego doświadczenia wynika, że ​​drzewa robocze nie są dobrze obsługiwane, z wyjątkiem najbardziej podstawowych części gita. Nie eksperymentowałem dogłębnie, Git prawdopodobnie zachowałby się, gdybym ustawił dowolną zmienną konfiguracyjną katalogu git, czym nie bawiłem się.

ThorSummoner
źródło
-1

Prawdopodobnie masz problem z uprawnieniami. Nie jestem pewien, jak skonfigurowałeś swoje gołe repozytorium git, ale jeśli działa w ramach konta gitużytkownika, upewnij się, że gitużytkownik ma uprawnienia do wykonywania git pullw katalogu twojego projektu.

Opcjonalnie spróbuj tego, aby dowiedzieć się, jakim jesteś użytkownikiem, gdy hak jest uruchomiony:

echo `whoami`
Ariejan
źródło
jeśli ssh do serwera jako użytkownik git, mogę bez problemu użyć git pull w katalogu mojego projektu. Uważam , że to użytkownik powinien wykonywać skrypt. Mogę spróbować dodać wiersz whoami do skryptu, ale dokąd idą dane wyjściowe tego skryptu, gdy jest wykonywany jako podpięcie? Może muszę wysłać te dane wyjściowe do pliku dziennika zamiast wyświetlać echo?
Ty W,
Czego to echo `whoami`nie whoamirobi?
Christoffer Hammarström
Wyjście ze skryptu przechwytującego na standardowe wyjście jest widoczne dla pilota wykonującego akcję. Innymi słowy, jeśli powiesz „git push”, wyjście z hooka na pilocie pojawi się na twoim stdout.
ebneter
tak, zauważyłem to, kiedy się bawiłem. bardzo wygodne :)
Ty W