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.
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.
Odpowiedzi:
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
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. -Cjest właściwą drogą.
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.
git stashjest kolejnym przykładem komendy, które nie działa, jeśli --git-diri --work-treesą stosowane.
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.
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
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ż
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.
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