git --git-dir funktioniert nicht wie erwartet

209

Ich versuche, git aus einem anderen Verzeichnis als dem auszuführen, in dem ich mich befinde. Zum Beispiel, wenn ich mich in:

cd /home/domain/
git status << runs perfect ie
# On branch master
# Your branch is ahead of 'origin/master' by 6 commits.

Jetzt möchte ich diesen Befehl mit der --git-dirOption aus einem anderen Verzeichnis ausführen .

Nehmen wir also an, ich bin dabei root/ und versuche Folgendes:

git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

Ich habe auch versucht, die aufzunehmen .git Ordner einzuschließen, dh

git --git-dir="/home/domain/.git/" status

Aber es sieht so aus, als würde versucht, git vom Stamm aus auszuführen, dh alles aus meinem Domänenordner zu löschen und alles im Stamm hinzuzufügen.

Hoffe, jemand kann beraten, was ich falsch mache.

Lee
quelle
4
Jetzt funktioniert der Status perfekt, aber Pull gibt Fehler. dh root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / Pull Origin Master fatal: / usr / local / libexec / git-core / git -pull kann nicht ohne einen funktionierenden Baum verwendet werden. Aber Status funktioniert? irgendwelche Ideen Jon
Lee
4
Dies ist der derzeit größte Fehler in Git. Die Parameter --work-tree und / oder --git-dir werden nicht berücksichtigt.
Adam Dymitruk
5
Ab Git 1.8.5 haben Sie die Wahl, nicht zu setzen --git-dirund --work-treefür einen einfachen Befehl: siehe meine Antwort unten
VonC

Antworten:

314

Sie müssen auch das Arbeitsverzeichnis definieren. Verwirrend weiß ich, aber es ist eine Sache der Flexibilität.

git --git-dir=/mycode/.git --work-tree=/mycode status

Sie können ein wenig mehr lesen hier

Jon Gretar
quelle
3
Danke das hat funktioniert! Einverstanden, dass dies verwirrend ist. Es heißt Keep It Simple Stupid. Sie können fast immer Flexibilität zulassen und gleichzeitig Standardeinstellungen festlegen, die am sinnvollsten sind, wenn ein Befehl überhaupt nicht funktioniert.
Nein,
3
@ Nick stimmte zu, Sie würden denken, wenn --git-dirnicht angegeben, würde es prüfen, ob/mycode/.git vorhanden, und dies verwenden, bevor ein Fehler wird.
GP89
4
@NickYeates abgeordnet! Außerdem hatte ich ein Problem bei der Verwendung von ~, um auf mein Home-Verzeichnis zu verweisen. Dies hat beispielsweise git --git-dir=~/src/s3cmd/.git --work-tree=~/src/s3cmd pullnicht funktioniert, aber git --git-dir=/home/username/src/s3cmd/.git --work-tree=/home/username/src/s3cmd pullfunktioniert
Jamie Cook
1
Beachten Sie, dass nicht für alle Befehle der Arbeitsbaum erforderlich ist. Beispiel: "git --git-dir = / mycode / .git log" funktioniert einwandfrei. Einverstanden, dass dies verwirrend ist!
Jojo
4
Kleine Klarstellung: git --git-dir="$HOME/foo/.git" --work-tree="$HOME/foo" status
Haris Krajina
136

Ab Git 1.8.5 (das nächste Woche erscheinen soll) wird es noch einfacher:

 git -C "/home/domain/" status

Keine Notwendigkeit mehr einzustellen --git-dirund --work-tree!


Sehen Commit 44e1e4 von Nazri Ramliy :

Es sind mehr Tastendrücke erforderlich, um den Befehl git in einem anderen Verzeichnis aufzurufen, ohne das aktuelle Verzeichnis zu verlassen:

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-dir=~/foo status
    GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
  2. (cd ../..; git grep foo)
  3. for d in d1 d2 d3; do (cd $d && git svn rebase); done

Die oben gezeigten Methoden sind für die Skripterstellung akzeptabel, für schnelle Befehlszeilenaufrufe jedoch zu umständlich.

Mit dieser neuen Option können die oben genannten Schritte mit weniger Tastenanschlägen ausgeführt werden:

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done
VonC
quelle
4
Ich wurde beim Versuch, das Flag -C nach dem Befehl git zu verwenden (z. B. git status -C <path>funktioniert es nicht!)
Kedar Paranjape
42

Aufgrund Ihres obigen Kommentars scheint es, als ob Sie immer noch auf ein Problem stoßen:

root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / pull origin master
fatal: / usr / local / libexec / git-core / git-pull kann nicht ohne einen funktionierenden Baum verwendet werden

Es hört sich so an, als ob Sie beabsichtigen, dies auszuführen crontaboder so. Möglicherweise ist es besser cd, zuerst in Ihr Arbeitsverzeichnis zu wechseln. Beispielsweise:

root @ erx [/] # (cd / home / domain && git pull origin master)

Dies ändert vorübergehend (in einer Unterschale, wie es die Klammern tun) das aktuelle Verzeichnis in /home/domainund wird dann ausgeführt git pull origin master. Nach Abschluss des Befehls bleibt Ihr aktuelles Verzeichnis so, wie es vor dem Befehl war.

Greg Hewgill
quelle
Die Verwendung einer Unterschale ist einfach und elegant. Ich weiß nicht, warum ich vorher nicht daran gedacht habe!
Ehtesh Choudhury
Sorry @Greg, habe die andere Antwort von Jon als Antwort auf die gestellte Frage abgestimmt - aber ich denke, du bist genau richtig darin, die Absicht zu erkennen und zu beantworten, und deine Einsicht, dh die () s, ist genau das, wonach ich gesucht habe +10
Darren Bishop
1
git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

Mit Git 2.26 (Q1 2020) ist die Dokumentation übersichtlicher.

Ein Effekt der Angabe, wo sich das GIT_DIRbefindet (entweder mit der Umgebungsvariablen oder mit der git --git-dir=<where> cmdOption " "), besteht darin , die Repository-Erkennung zu deaktivieren .

Dies wurde in der Dokumentation etwas stärker betont, da neue Benutzer häufig verwirrt sind.

Siehe Commit d82ad54 (30. Januar 2020) von Heba Waly ( HebaWaly) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 17e4a1b , 12. Februar 2020)

git: Dokumentation für --git-dir aktualisieren

Unterzeichnet von: Heba Waly
Unterstützt von: Junio ​​C Hamano

git --git-dir <path> ist etwas verwirrend und funktioniert manchmal nicht so, wie es der Benutzer erwarten würde.

Wenn der Benutzer beispielsweise ausgeführt git --git-dir=<path> statuswird, überspringt git den Repository-Erkennungsalgorithmus und weist den Arbeitsbaum dem aktuellen Arbeitsverzeichnis des Benutzers zu, sofern nicht anders angegeben.
Wenn diese Zuordnung falsch ist, entspricht die Ausgabe nicht den Erwartungen des Benutzers.

Dieser Patch aktualisiert die Dokumentation, um sie klarer zu gestalten.

Die Dokumentation für dengit --git-dir Moment enthält also:

--git-dir=<path>:

Legen Sie den Pfad zum Repository (" .git" Verzeichnis) fest.
Dies kann auch durch Einstellen der GIT_DIRUmgebungsvariablen gesteuert werden .
Dies kann ein absoluter Pfad oder ein relativer Pfad zum aktuellen Arbeitsverzeichnis sein.

Wenn Sie den Speicherort des .gitVerzeichnisses " " mit dieser Option (oder GIT_DIRUmgebungsvariablen) angeben, wird die Repository- Erkennung deaktiviert, die versucht, ein Verzeichnis mit "" zu finden..git Unterverzeichnis " (auf diese Weise werden das Repository und die oberste Ebene des Arbeitsbaums ermittelt). und teilt Git mit, dass Sie sich auf der obersten Ebene des Arbeitsbaums befinden.

Wenn Sie sich nicht im Verzeichnis der obersten Ebene des Arbeitsbaums befinden, sollten Sie Git mit der --work-tree=<path>Option (oder GIT_WORK_TREEUmgebungsvariablen) mitteilen, wo sich die oberste Ebene des Arbeitsbaums befindet.

VonC
quelle