Czy w haku git bieżący katalog roboczy znajduje się w repozytorium git?

81

Eksperymentalnie wydaje się, że haki git są uruchamiane z bieżącym katalogiem ustawionym jako katalog główny repozytorium. Jednak nie widzę żadnej gwarancji na to w dokumentacji gita. Czy powinienem polegać na bieżącym katalogu roboczym, aby zlokalizować repozytorium git, czy jest lepszy sposób na rozwiązanie repozytorium git skojarzonego z punktem zaczepienia?

Dick Reed
źródło
4
Nie wiem, jak bardzo to jest powiązane. Na stabilnej wersji Gentoo z Git 2.7.3 (-r1) przechwyty git są nie tylko wykonywane w, .gitale w git reset --hardrzeczywistości tworzą roboczą strukturę katalogów wewnątrz .gitkatalogu, co moim zdaniem jest całkowicie niewłaściwe!
Pavel Šimerda

Odpowiedzi:

45

Opiera się na wartości ustawionej dla zmiennej środowiskowej GIT_DIR. Jest ustawiany na katalog główny repozytorium, gdy hak zaczyna działać. Wiele punktów zaczepienia, szczególnie tych wykonujących ściąganie z innego repozytorium, w razie potrzeby wyłącza (i resetuje) tę zmienną środowiskową.

manojlds
źródło
6
Czy $ GIT_DIR ma na końcu ukośnik?
PuercoPop
8
To NIE jest poprawna odpowiedź. GIT_DIR NIE zawsze jest ustawiony na katalog główny repozytorium. Zobacz tego bloga .
Ghopper
2
@ Ghopper21 Ten artykuł też nie jest do końca poprawny. Mówi, że dla punktu zaczepienia po zatwierdzeniu bieżącym katalogiem jest najwyższy poziom drzewa roboczego. Jednak mój bardzo prosty skrypt po zatwierdzeniu nie znalazł innych skryptów na najwyższym poziomie drzewa roboczego. np .:.git/hooks/post-commit: 1: .git/hooks/post-commit: post-commit_push_gitweb.sh: not found
Vince
70

Obecne odpowiedzi wydają się być nieaktualne. Od wersji 2.9.0 dokumenty zawierają następujące informacje:

Przed wywołaniem hooka Git zmienia swój katalog roboczy albo na katalog główny drzewa roboczego w nie-nagim repozytorium, albo na $ GIT_DIR w czystym repozytorium.

https://git-scm.com/docs/githooks/2.9.0

Ohad Schneider
źródło
12
Świetna odpowiedź. Wyjaśnienie zostało wprowadzone w późniejszych wersjach (2.13.0). „Wyjątkiem są punkty zaczepienia wyzwalane podczas wypychania (przed odbiorem, aktualizacją, po odbiorze, po aktualizacji, wypychanie do kasy), które są zawsze wykonywane w $ GIT_DIR."
Nowicjusz C
2
Źródło / kontekst powyższego cytatu: git-scm.com/docs/githooks#_description
jmcker
1
Mówiąc prostym językiem: jest to katalog najwyższego poziomu twojego repozytorium. („Nagie” odnosi się zasadniczo do repozytorium składającego się tylko z .gitkatalogu i bez wyewidencjonowanych plików.)
Ben Mares
4

Możesz użyć zmiennej środowiskowej $GIT_DIR. $GIT_DIRwskazuje .gitkatalog.

Holygeek
źródło
Jakie jest prawdopodobieństwo, że $GIT_DIR/..wskaże katalog główny repozytorium?
David Lord
To nie jest niezawodne. Nie używaj $GIT_DIR/... To się zepsuje, gdy repozytorium będzie gołym repozytorium. Czyste repozytorium nie ma katalogu roboczego, dlatego nie ma „katalogu głównego repozytorium”. Zepsuje się również, gdy .git jest łączem.
holygeek
1
Wzorzysty. Jakiś sposób na uzyskanie katalogu głównego repozytorium przy normalnym użytkowaniu? Na przykład dla haka przed zatwierdzeniem, który używa repozytorium jako plików konfiguracyjnych dla programu?
David Lord
3
NIE jest to poprawne we wszystkich przypadkach. Zobacz tego bloga .
Ghopper