Jak wykonać polecenie Git, nie będąc w repozytorium?

131

Czy istnieje sposób na wykonanie poleceń Git w repozytorium bez przebywania w tym repozytorium?

Na przykład coś takiego git /home/repo log:?

Proszę mi nie mówić cd. Robię to przez exectelefon.

Wieża
źródło
3
Czy nie możesz po prostu użyć polecenia „cd / home / repo && git log” jako wywołania exec?
Alex Howansky
Mam z tym dziwne problemy. Rozpoczynam nowy proces, a nie exec, ale nie wiem zbytnio, czym się różnią. Łatwiej jest znaleźć parametr określający katalog git.
Wieża
1
Możliwy duplikat git pull poza katalogiem git
Trevor Boyd Smith
1
git --git-dir = / home / repo / .git log
Atiq Ur Rehman

Odpowiedzi:

102

Próbować:

git --git-dir=/home/repo/.git log

Ważne jest, aby podać ścieżkę aż do katalogu .git repozytorium. W przeciwnym razie otrzymasz tylko komunikat o błędzie, który mówi mniej więcej tak:

fatal: Not a git repository
max
źródło
2
Ciągle się dostaję fatal: Not a git repository (or any of the parent directories): .git. @Patrick Nie przegłosowałem niczego?
Wieża
3
@Patrick Odpowiedź została zredagowana (pierwotnie mówiła, --work-dirże myślę)
Gareth
1
To nie zadziałało dla mnie, ponieważ pokazało wszystkie pliki zatwierdzenia jako usunięte. Wygląda na to, że sprawdza zatwierdzenie, ale nie zawartość folderu. Zapoznaj się z odpowiedzią @calandoa, aby uzyskać lepszą wydajność.
mxcd
2
Nie działało dla mnie przy użyciu najnowszego gita, jednak przy użyciu opcji -C zadziałało, przykład: git -C /home/repo/.git log
D.Snap
1
to faktycznie nie działało zgodnie z oczekiwaniami po. dlaczego jest to akceptowana odpowiedź? Spowoduje to użycie bieżącego katalogu jako drzewa roboczego i określonego pliku .git jako historii, co jest całkowicie błędne. Jeśli nie wyświetlisz tylko dziennika, na przykład git status. -Cjest właściwą drogą.
Wang
219

Użyj -Copcji ( dokumenty ):

git -C /home/repo log

Jest to prawie równoważne --git-diri --work-treebez dołączania zwykłego .gitfolderu

Edytować:

Odpowiedź odrzucona ... dość zdumiewające, bo ściśle mówiąc, to jedyna poprawna odpowiedź na to pytanie. Opcje --git-diri --work-treenie istnieją, aby uzyskać dostęp do repozytorium spoza drzewa roboczego, są one używane do przenoszenia w .gitinne miejsce i są znacznie bardziej skomplikowane w niektórych przypadkach.

Na przykład, aby uzyskać dziennik /home/repo/subdirtylko:

git -C /home/repo/subdir log .

lub

git -C /home/repo log subdir

Nie można używać log .z --git-dirlub --work-tree. Ścieżka musi zostać przetworzona, aby wyodrębnić podścieżkę względem wierzchołka drzewa roboczego, a nawet w takim przypadku git nie rozpozna jej jako ścieżki, jeśli nie użyjesz tej --opcji, więc jedynym możliwym sposobem jest:

git --git-dir /home/repo/.git log -- subdir

Co więcej, --work-treew ogóle nie działa z logkomendą w mojej wersji (git 1.9.1). Jest po prostu ignorowany:

git --git-dir /home/repo/.git --work-tree /home/repo/subdir log -- subdir
git --git-dir /home/repo/.git --work-tree /home/repo/whatever log -- subdir

Nie rozumiem nawet, czy jest to błąd, czy funkcja ... jak zwykle w przypadku wielu wyborów projektowych gita.

calandoa
źródło
Dziękuję za dodanie dodatkowych wyjaśnień.
Erick G. Hagstrom
git stashjest kolejnym przykładem komendy, które nie działa, jeśli --git-diri --work-treesą stosowane.
d5ve
4
Opcja -C została dodana w wersji 1.8.5 gita, która została wydana w 2013 roku.
d5ve
-C działało lepiej niż --git-dir dla mnie ... -C honoruje ustawienia konfiguracji git dla repozytorium. Używam gita w wersji 1.9.5.msysgit.1
Straff,
1
Uwaga: musisz przekazać opcję -C do git, a nie do podkomendy (jak poprawnie zrobił to @calandoa w tej odpowiedzi). Wywołanie git -C /some/dir add .będzie działać zgodnie z oczekiwaniami, podczas gdy git add -C /some/dir .spowoduje zgłoszenie błędu. Po prostu coś, o czym należy pamiętać, aby uniknąć mylących wyników.
Paul van Leeuwen
17

W rzeczywistości musisz używać razem --git-dir i --work-tree. Oto przykład:

local [] Desktop: mkdir git
local [] Desktop: cd git
local [] git: touch README.txt
local [] git: git init
Initialized empty Git repository in /Users/albert/Desktop/git/.git/
local [] git: cd ..
local [] Desktop: git --work-tree=git --git-dir=git/.git add .
local [] Desktop: git --work-tree=git --git-dir=git/.git commit -a -m 'initial commit, called from outside the git directory'
[master (root-commit) ee951b1] initial commit, called from outside the git directory
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.txt
local [] Desktop: cd git
local [] git: git log --pretty=oneline
ee951b161053e0e0948f9e2a36bfbb60f9c87abe initial commit, called from outside the git di
alberto56
źródło
1
Jest to bardziej poprawne niż odpowiedź z samym --git-dir. git-scm.com/blog/2010/04/11/environment.html
Erick G. Hagstrom
11

Próbowałem wiele razy! W końcu to dostałem!

git -C dir --no-pager log --format='%an' -1 filename

pamiętaj, proszę nie dodawać .git do swojego

-C reż

penny chan
źródło
3

Jest to podobne do odpowiedzi @ max. Niestety --git-dir nie zrobił tego, czego potrzebowałem. edytuj Z perspektywy czasu inna [poprzednia] odpowiedź, której nie czytałem, sugerowała użycie --work-tree. Nie jestem pewien, czy użycie środowiska lub flag jest bardziej odpowiednie, więc zostawię swoją odpowiedź na wypadek, gdyby ktoś znalazł w niej użycie, ale przełączę się na użycie --work-tree/ --git-dir.


Istnieją dwa repozytoria, jedno wewnątrz drugiego, ale nie jest to moduł podrzędny; repozytorium zewnętrzne ignoruje to:

tools (outer repo)
  gcc/4.9.2 (inner repo)

To, czego chciałem, to wynik git rev-parse --show-prefixwzględny w stosunku do zewnętrznego repo. Oto, co wymyśliłem (składnia bash; podziel na linie dla czytelności):

prefix_dir=$(cd ..; git rev-parse --show-toplevel)
prefix_dir=$(GIT_WORK_TREE=${prefix_dir} git rev-parse --show-prefix)

Po wykonaniu z poziomu 4.9.2 tworzy łańcuch gcc/4.9.2.

Brian Vandenberg
źródło
1

Dla każdego polecenia git możesz wykonać:

git --git-dir=<PATH-TO-REPO>/.git --work-tree=<PATH-TO-REPO> <git-command>

Na przykład, jeśli chcesz uzyskać status gita:

 git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  status

lub jeśli chcesz sprawdzić oddział, w którym znajduje się repozytorium:

git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  rev-parse --abbrev-ref HEAD
Paula
źródło