Befindet sich in einem Git-Hook das aktuelle Arbeitsverzeichnis garantiert im Git-Repository?

81

Experimentell scheint es, dass Git-Hooks mit dem aktuellen Verzeichnis ausgeführt werden, das als Stamm des Repositorys festgelegt ist. Ich kann jedoch keine Garantie dafür in der Git-Dokumentation sehen. Sollte ich mich auf das aktuelle Arbeitsverzeichnis verlassen, um das Git-Repository zu finden, oder gibt es eine bessere Möglichkeit, das mit dem Hook verknüpfte Git-Repository zu ermitteln?

Dickon Reed
quelle
4
Nicht sicher, wie viel das zusammenhängt. Auf einer Gentoo-Stable-Box mit Git 2.7.3 (-r1) werden Git-Hooks nicht nur ausgeführt, .gitsondern erstellen git reset --hardtatsächlich die Arbeitsverzeichnisstruktur innerhalb des .gitVerzeichnisses, was meiner Meinung nach völlig falsch ist!
Pavel Šimerda

Antworten:

45

Es basiert auf dem Wert, der für die Umgebungsvariable festgelegt wurde GIT_DIR. Es wird auf das Stammverzeichnis des Repositorys gesetzt, wenn der Hook ausgeführt wird. Viele Hooks, insbesondere diejenigen, die aus einem anderen Repo ziehen, setzen diese Umgebungsvariable nach Bedarf zurück (und setzen sie zurück).

Manojlds
quelle
6
Hat $ GIT_DIR einen abschließenden Schrägstrich?
PuercoPop
8
Dies ist KEINE richtige Antwort. GIT_DIR wird NICHT immer auf die Wurzel des Repos gesetzt. Siehe diesen Blog .
Ghopper21
2
@ Ghopper21 Dieser Artikel ist auch nicht ganz richtig. Es heißt, dass für den Post-Commit-Hook das aktuelle Verzeichnis die oberste Ebene des Arbeitsbaums ist. In meinem sehr einfachen Post-Commit-Skript wurden jedoch keine anderen Skripte auf der obersten Ebene des Arbeitsbaums gefunden. zB:.git/hooks/post-commit: 1: .git/hooks/post-commit: post-commit_push_gitweb.sh: not found
Vince
67

Die aktuellen Antworten scheinen veraltet zu sein. Ab 2.9.0 wird in den Dokumenten Folgendes angegeben:

Bevor Git einen Hook aufruft, ändert es sein Arbeitsverzeichnis entweder in das Stammverzeichnis des Arbeitsbaums in einem nicht nackten Repository oder in $ GIT_DIR in einem nackten Repository.

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

Ohad Schneider
quelle
11
Gute Antwort. In späteren Überarbeitungen (2.13.0) wurde eine Klarstellung vorgenommen. "Eine Ausnahme bilden Hooks, die während eines Pushs ausgelöst werden (Pre-Receive, Update, Post-Receive, Post-Update, Push-to-Checkout) und immer in $ GIT_DIR ausgeführt werden."
Anfänger C
2
Quelle / Kontext für das obige Zitat: git-scm.com/docs/githooks#_description
jmcker
Im Klartext: Es ist das oberste Verzeichnis Ihres Repositorys. ("Bare" bezieht sich im Wesentlichen auf ein Repository, das nur aus dem .gitVerzeichnis besteht und in dem keine Dateien
Ben Mares
4

Sie können die Umgebungsvariable verwenden $GIT_DIR. $GIT_DIRzeigt auf das .gitVerzeichnis.

Holygeek
quelle
Wie wahrscheinlich ist es, dass $GIT_DIR/..auf das Repository-Stammverzeichnis verwiesen wird?
David Lord
Es ist nicht kinderleicht. Nicht benutzen $GIT_DIR/... Das wird kaputt gehen, wenn das Repo ein nacktes Repo ist. Ein nacktes Repo hat kein Arbeitsverzeichnis, daher kein "Repository-Stammverzeichnis". Außerdem wird es unterbrochen, wenn .git stattdessen ein Link ist.
Holygeek
1
Abgebildet. Gibt es eine Möglichkeit, das Repo-Root bei normaler Verwendung zu erhalten? Für einen Pre-Commit-Hook, der das Repo beispielsweise als Konfigurationsdateien für ein Programm verwendet?
David Lord
3
Dies ist NICHT in allen Fällen korrekt. Siehe diesen Blog .
Ghopper21