Użyj polecenia git „log” w innym folderze

128

Mam kilka plików php w folderze A (który jest projektem git). W tym pliku php chcę wykonać "dziennik git", ale dla folderu B. Folder B to kolejny projekt git (więc log różni się między A i B).

Jak mogę to zrobić za pomocą polecenia powłoki?

Aurélien B
źródło
3
cd /other/dir && git log && cd -w powłoce bash?
takeshin
1
Z git 1.8.5 (Q4 2013), będziesz miał inny wybór, zamiast ustawiania --git-dir: zobacz moją odpowiedź poniżej
VonC
Możliwy duplikat git pull poza katalogiem git
Code-Apprentice

Odpowiedzi:

189

Od man git:

Możesz to zrobić za pomocą --git-dirparametru, przed przekazaniem jakichkolwiek poleceń.

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

( .gitKonieczne jest określenie katalogu). Z dokumentacji :

--git-dir=<path>

Ustaw ścieżkę do repozytorium. Można to również kontrolować, ustawiając GIT_DIRzmienną środowiskową. Może to być ścieżka bezwzględna lub ścieżka względna do bieżącego katalogu roboczego.

rgngl
źródło
26
Musisz odwołać się do .gitkatalogu. Spróbuj git --git-dir=/foo/bar/.git log.
mipadi
6
przepraszam, moja wina, że ​​nie umieszczasz = między --git-dir a nazwą katalogu. więc staje się git --git-dir / foo / bar log
rgngl
23
Ostrzeżenie! To podejście jest zepsute w przypadku operacji innych niż log. Spróbuj git --git-dir /foo/someclone/.git status- git jest całkowicie zdezorientowany. Polecam, -Cjak podano poniżej.
Air
Nie znalazłem jeszcze strony pomocy git zawierającej ciąg „--git-dir”: '(
thinsoldier
1
@thinsoldier man gitdziała w moim systemie (2.3.5). Ale odpowiedź @VonC działa znacznie lepiej.
Calimo
145

Z git 1.8.5 (Q4 2013) będziesz miał inny wybór zamiast ustawiania --git-dir.
Jeśli chcesz wykonać git logw folderze B, wpisz:

git -C B log

Tak jak „ make -C <directory>”, git -C <directory> ...” mówi Gitowi, aby udał się tam, zanim zrobi cokolwiek innego .


Zobacz popełnić 44e1e4 przez Nazri Ramliy :

Wywołanie polecenia git w innym katalogu bez opuszczania bieżącego katalogu wymaga więcej naciśnięć klawiszy:

  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

Przedstawione powyżej metody są dopuszczalne w przypadku skryptów, ale są zbyt uciążliwe dla szybkich wywołań wiersza poleceń.

Dzięki tej nowej opcji powyższe czynności można wykonać za pomocą mniejszej liczby naciśnięć klawiszy:

  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
źródło
19
Jest to znacznie bardziej niezawodne podejście i działa w przypadku poleceń innych niż log.
Air
wow, i nic na stronie podręcznika! Jaka szkoda. (ok, teraz widzę to dodane na stronie
podręcznika
Niestety, nadal nie jest to tak przyjemne, jak -Ropcja Mercurial , ponieważ zakłóca względne ścieżki. Na przykład, jeśli git -C subdir log subdir/myfilewpisuję, wyświetla błąd (ponieważ szuka pliku subdir/subdir/myfile).
jwd
--git-dir jest wygodniejszy, gdy robisz coś takiego:for p in (find . -type d -name ".git"); do git --git-dir $p ...; done
shabunc
1
@jwd: Nie jestem pewien, jaki to problem? To, co zacytowałeś, to dokładne zachowanie, którego bym się spodziewał, i nie chciałbym gitmyśleć, że jest mądrzejszy ode mnie i tego, co napisałem. Jeśli mówię „uruchom to w katalogu X”, nie mam na myśli „z wyjątkiem tego, że czasami zrób coś innego”.
underscore_d