Verwenden Sie den Befehl git "log" in einem anderen Ordner

127

Ich habe einige PHP-Dateien in einem Ordner A (das ist ein Git-Projekt). In dieser PHP-Datei möchte ich "Git-Protokoll" ausführen, aber für den Ordner B. Ordner B ist ein anderes Git-Projekt (daher unterscheidet sich das Protokoll zwischen A und B).

Wie kann ich das mit dem Shell-Befehl machen?

Aurélien B.
quelle
3
cd /other/dir && git log && cd -in Bash Shell?
Takeshin
1
Mit Git 1.8.5 (Q4 2013) haben Sie eine andere Wahl, anstatt zu setzen --git-dir: siehe meine Antwort unten
VonC
Mögliches Duplikat von Git Pull, wenn es sich nicht in einem Git-Verzeichnis befindet
Code-Apprentice

Antworten:

188

Von man git:

Sie können dies mit dem --git-dirParameter tun , bevor Sie Befehle übergeben.

git --git-dir /foo/bar/.git log

(Die Angabe des .gitVerzeichnisses ist erforderlich.) Aus der Dokumentation :

--git-dir=<path>

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

rgngl
quelle
26
Sie müssen auf das .gitVerzeichnis verweisen . Versuchen Sie es git --git-dir=/foo/bar/.git log.
Mipadi
6
Entschuldigung, mein Unrecht, Sie setzen das = nicht zwischen --git-dir und den Verzeichnisnamen. so wird es git --git-dir / foo / bar log
rgngl
23
Warnung! Dieser Ansatz ist für andere Operationen als gebrochen log. Try git --git-dir /foo/someclone/.git status- git wird total verwirrt. Ich empfehle -Cwie unten angegeben.
Air
Ich habe noch keine Git-Hilfeseite gefunden, die die Zeichenfolge "--git-dir" enthält: '(
Thinsoldier
1
@thinsoldier man gitmacht auf meinem System (2.3.5). Aber @VonC Antwort funktioniert viel besser.
Calimo
144

Mit git 1.8.5 (Q4 2013) haben Sie eine andere Wahl als die Einstellung --git-dir.
Wenn Sie git login einem Ordner ausführen möchten, geben Sie Folgendes ein B:

git -C B log

Genau wie „ make -C <directory>“, git -C <directory> ...“ sagt Git , dorthin zu gehen , bevor irgendetwas anderes zu tun .


Siehe 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-tree=~/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
19
Dies ist ein viel zuverlässigerer Ansatz und funktioniert für andere Befehle als log.
Air
wow und nichts auf der manpage! Schade. (ok, jetzt sehe ich es in 2.7 Manpage hinzugefügt)
Akostadinov
Leider ist dies immer noch nicht ganz so schön wie die -ROption von Mercurial , da es relative Pfade durcheinander bringt. Wenn ich zum Beispiel tippe git -C subdir log subdir/myfile, wird ein Fehler ausgegeben (da nach der Datei gesucht wird subdir/subdir/myfile).
JWD
- Git-Dir ist handlicher, wenn Sie so etwas tun:for p in (find . -type d -name ".git"); do git --git-dir $p ...; done
Shabunc
1
@jwd: Ich bin nicht sicher, wie das ein Problem ist? Was Sie zitiert haben, ist das genaue Verhalten, das ich erwarten würde, und ich würde nicht gitglauben wollen , dass es klüger ist als ich und was ich getippt habe. Wenn ich "Führe dies in Verzeichnis X aus" sage, meine ich nicht "außer manchmal etwas anderes tun".
underscore_d