2014-01-13 9 views
5

Ich schreibe ein Skript für einige Kollegen auf ihre Git-Repositories zu verwenden, und ich bin verwirrt, wie zuverlässig finden Sie das Stammverzeichnis der Repo-Arbeitsbaum:Gibt es eine Möglichkeit, den Arbeitsbaum eines Git-Repos zu finden, wenn man das .git-Verzeichnis verwendet?

In der Regel, wenn das aktuelle Verzeichnis in einem ist Arbeit Baum, die Befehle ...

git rev-parse --git-dir 
git rev-parse --show-toplevel 

... würden die Wurzeln des .git Verzeichnis und Arbeitsbaum zurückkehren, respectively. Wenn das aktuelle Verzeichnis jedoch innerhalb ein Verzeichnis .git ist, funktioniert nur der erste Befehl. Der Befehl git rev-parse --show-toplevel zeigt nicht die oberste Ebene des Arbeitsbaums (zumindest nicht für mich, die git 1.8.4.4 unter Linux verwendet).

Unter der Annahme, dass git rev-parse --is-bare-repository kehrt false, würde ich normalerweise vermuten, dass das übergeordnete Verzeichnis von git rev-parse --git-dir ist entweder das Arbeitsverzeichnis (oder irgendwo im Arbeitsverzeichnis), aber wenn die Benutzer-GIT_DIR gesetzt, dass das .git Verzeichnis nicht innerhalb der Arbeitsverzeichnis, das wird nicht funktionieren. (Zum Beispiel, wenn der Benutzer mit Submodule arbeiten, ihre GIT_DIR vielleicht nicht in ihrer Arbeit Baum sein.)

Was ich verwirrend ist, dass, wenn innerhalb einer GIT_DIR, git rev-parse --show-toplevel drucken keine Fehlermeldungen laufen und gibt 0:

$ cd $(git rev-parse --git-dir); git rev-parse --show-toplevel ; echo $? 
0 

Während irgendwo den gleichen Befehl ausgeführt wird, ist eindeutig kein Git Repository einen Fehlercode zurück:

$ cd /; git rev-parse --show-toplevel ; echo $? 
fatal: Not a git repository (or any of the parent directories): .git 
128 

Wenn there'a eine Möglichkeit, die Arbeit Baum vom GIT_DIR zu finden, könnte jemand te Wie kann ich ... oder wenn es einfach nicht möglich ist, den Standort des Arbeitsbaums aus dem .git-Verzeichnis abzuleiten, mir helfen zu verstehen, warum das .git-Verzeichnis philosophisch gesehen keinen Verweis auf seinen Arbeitsbaum enthält?

Vielen Dank im Voraus für Hilfe/Zeiger!

Antwort

4

Warum, philosophisch betrachtet, behält das .git-Verzeichnis keinen Verweis auf seinen Arbeitsbaum?

Weil Sie die Arbeits Baum irgendwo einstellen können Sie (mit der Option --work-tree oder GIT_WORK_TREE Umgebungsvariable) möchten, an einem Ort, einschließlich der (und es ist das Ziel) beinhaltet nicht die .git Ordner.

Die git config man page tut erwähnen:

Der Wert kann einen absoluten Pfad oder relativ zu dem Pfad zu dem Verzeichnis .git, die entweder durch --git-dir oder GIT_DIR oder automatisch entdeckt angegeben wird.
Wenn --git-dir oder GIT_DIR angegeben ist, aber keines von --work-tree, GIT_WORK_TREE und core.worktree angegeben ist, wird das aktuelle Arbeitsverzeichnis als oberste Ebene Ihres Arbeitsbaums angesehen.

So ist es eine Konvention basiert auf dem Arbeitsbaum Ordner (um die .git zu finden) statt umgekehrt (herzuleiten Arbeits Baum aus dem .git Ordner).

Das gesagt, ich liste alle Befehle auf, die Ihnen eine Idee des Arbeitsbaumordners in "How to find the path of the local git repository when I am possibly in a subdirectory" geben können.

Verwandte Themen