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.
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ą.
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 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
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):
Odpowiedzi:
Próbować:
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:
źródło
fatal: Not a git repository (or any of the parent directories): .git
. @Patrick Nie przegłosowałem niczego?--work-dir
że myślę)git status
.-C
jest właściwą drogą.Użyj
-C
opcji ( dokumenty ):Jest to prawie równoważne
--git-dir
i--work-tree
bez dołączania zwykłego.git
folderuEdytować:
Odpowiedź odrzucona ... dość zdumiewające, bo ściśle mówiąc, to jedyna poprawna odpowiedź na to pytanie. Opcje
--git-dir
i--work-tree
nie istnieją, aby uzyskać dostęp do repozytorium spoza drzewa roboczego, są one używane do przenoszenia w.git
inne miejsce i są znacznie bardziej skomplikowane w niektórych przypadkach.Na przykład, aby uzyskać dziennik
/home/repo/subdir
tylko:lub
Nie można używać
log .
z--git-dir
lub--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:Co więcej,
--work-tree
w ogóle nie działa zlog
komendą w mojej wersji (git 1.9.1). Jest po prostu ignorowany:Nie rozumiem nawet, czy jest to błąd, czy funkcja ... jak zwykle w przypadku wielu wyborów projektowych gita.
źródło
git stash
jest kolejnym przykładem komendy, które nie działa, jeśli--git-dir
i--work-tree
są stosowane.git -C /some/dir add .
będzie działać zgodnie z oczekiwaniami, podczas gdygit add -C /some/dir .
spowoduje zgłoszenie błędu. Po prostu coś, o czym należy pamiętać, aby uniknąć mylących wyników.W rzeczywistości musisz używać razem --git-dir i --work-tree. Oto przykład:
źródło
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
źródło
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:
To, czego chciałem, to wynik
git rev-parse --show-prefix
względny w stosunku do zewnętrznego repo. Oto, co wymyśliłem (składnia bash; podziel na linie dla czytelności):Po wykonaniu z poziomu 4.9.2 tworzy łańcuch
gcc/4.9.2
.źródło
Dla każdego polecenia git możesz wykonać:
Na przykład, jeśli chcesz uzyskać status gita:
lub jeśli chcesz sprawdzić oddział, w którym znajduje się repozytorium:
źródło