git --git-dir nie działa zgodnie z oczekiwaniami

209

Próbuję uruchomić git z innego katalogu niż ja. Więc na przykład, jeśli jestem w:

cd /home/domain/
git status << runs perfect ie
# On branch master
# Your branch is ahead of 'origin/master' by 6 commits.

Więc teraz chcę uruchomić to polecenie z innego katalogu przy użyciu --git-diropcji.

Powiedzmy, że jestem w root/środku i wypróbuj to:

git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

Próbowałem również dołączyć .gitfolder tj

git --git-dir="/home/domain/.git/" status

Ale wygląda na to, że próbuje uruchomić git z katalogu głównego, tzn. Usuwa wszystko z mojego folderu domeny i dodaje wszystko do katalogu głównego.

Mam nadzieję, że ktoś może doradzić, co robię źle.

Zawietrzny
źródło
4
Teraz mam doskonały status, ale pull daje błędy. tj. root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / pull origin master fatal: / usr / local / libexec / git-core / git -pull nie może być użyty bez działającego drzewa. Ale status działa? jakiekolwiek pomysły Jon
Lee
4
To obecnie największy błąd w git. Nieprzestrzeganie parametrów --work-tree i / lub --git-dir.
Adam Dymitruk
5
Począwszy od gita 1.8.5, będziesz miał wybór, aby nie ustawiać --git-diri --work-treedla prostego polecenia: zobacz moją odpowiedź poniżej
VonC

Odpowiedzi:

314

Musisz również zdefiniować działający katalog. Mylące wiem, ale to kwestia elastyczności.

git --git-dir=/mycode/.git --work-tree=/mycode status

Możesz przeczytać więcej tutaj

Jon Gretar
źródło
3
Dzięki, działało! Zgodził się, że jest to mylące. Nazywa się Keep It Simple Stupid. Prawie zawsze możesz pozwolić na elastyczność, a jednocześnie podać wartości domyślne, które mają największy sens, gdy VS nie ma polecenia.
Nie
3
@Nick zgodził się, pomyślałbyś, że gdyby --git-dirnie został określony, sprawdziłby, czy /mycode/.gitistnieje i użyłby tego przed zgłoszeniem błędu.
GP89
4
@NickYeates oddelegowany! Również miałem problem przy korzystaniu ~ odnieść się do mojego katalogu domowego, na przykład git --git-dir=~/src/s3cmd/.git --work-tree=~/src/s3cmd pullnie działał, ale git --git-dir=/home/username/src/s3cmd/.git --work-tree=/home/username/src/s3cmd pulltak
Jamie Cook
1
Zauważ, że nie wszystkie polecenia wymagają drzewa roboczego, na przykład „git --git-dir = / mycode / .git log” działa poprawnie. Zgodziłem się, że jest to mylące!
yoyo
4
Małe wyjaśnienie: git --git-dir="$HOME/foo/.git" --work-tree="$HOME/foo" status
Haris Krajina
136

Począwszy od gita 1.8.5 (który powinien być dostępny w przyszłym tygodniu), będzie to jeszcze prostsze:

 git -C "/home/domain/" status

Nie trzeba ustawić --git-diri --work-treejuż!


Zobacz commit 44e1e4 autorstwa Nazri Ramliy :

Więcej naciśnięć klawiszy wymaga wywołania polecenia git w innym katalogu bez opuszczania bieżącego katalogu:

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-dir=~/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

Metody pokazane powyżej są dopuszczalne dla skryptów, ale są zbyt kłopotliwe dla szybkich wywołań z wiersza poleceń.

Dzięki tej nowej opcji można to zrobić przy mniejszej liczbie 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
4
Potknąłem się, próbując użyć flagi -C po komendzie git (np. git status -C <path>Nie zadziała!)
Kedar Paranjape
42

Na podstawie powyższego komentarza wydaje się, że nadal masz problem:

root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / pull origin master
fatal: / usr / local / libexec / git-core / git-pull nie można używać bez działającego drzewa

Wygląda na to, że masz zamiar to uruchomić crontab. Lepiej skorzystaj cdz przejścia do katalogu roboczego. Na przykład:

root @ erx [/] # (cd / home / domain && git pull origin master)

Spowoduje to tymczasowe (w podpowłoce, co robią nawiasy) zmianę bieżącego katalogu na /home/domain, a następnie uruchomienie git pull origin master. Po zakończeniu polecenia bieżący katalog pozostaje taki, jaki był przed poleceniem.

Greg Hewgill
źródło
Korzystanie z podpowłoki jest proste i eleganckie. Nie wiem, dlaczego wcześniej o tym nie myślałem!
Ehtesh Choudhury
Przepraszam @Greg, przegłosowałem drugą odpowiedź Jona, ponieważ odpowiedziała na zadane pytanie - ale myślę, że jesteś na miejscu dostrzegania i odpowiadania na intencję i twój wgląd, tj. (), Jest dokładnie tym, czego szukałem +10
Darren Bishop
1
git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

W przypadku Git 2.26 (Q1 2020) dokumentacja jest jaśniejsza.

Jednym ze skutków określenia, gdzie GIT_DIRjest (za pomocą zmiennej środowiskowej lub opcji „ git --git-dir=<where> cmd”), jest wyłączenie wykrywania repozytorium .

Zostało to nieco bardziej obciążone w dokumentacji, ponieważ nowi użytkownicy często się mylą.

Zobacz commit d82ad54 (30 stycznia 2020 r.), Autor: Heba Waly ( HebaWaly) .
(Połączone przez Junio ​​C Hamano - gitster- w commit 17e4a1b , 12 lutego 2020)

git: zaktualizuj dokumentację dla --git-reir

Podpisano: Heba Waly
Pomocnik: Junio ​​C. Hamano

git --git-dir <path> jest nieco mylące i czasami nie działa tak, jak użytkownik by tego oczekiwał.

Na przykład, jeśli użytkownik uruchomi się git --git-dir=<path> status, git pominie algorytm wykrywania repozytorium i przypisze drzewo robocze do bieżącego katalogu roboczego użytkownika, chyba że określono inaczej.
Jeśli to przypisanie jest nieprawidłowe, dane wyjściowe nie będą zgodne z oczekiwaniami użytkownika.

Ta poprawka aktualizuje dokumentację, aby była jaśniejsza.

Więc dokumentacjagit --git-dir obejmuje obecnie:

--git-dir=<path>:

Ustaw ścieżkę do repozytorium ( .gitkatalogu „ ”).
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.

Określenie położenia katalogu „ .git za pomocą tej opcji (lub GIT_DIRzmiennej środowiskowej) wyłącza wykrywanie repozytorium, które próbuje znaleźć katalog z .gitpodkatalogiem „ ” (w ten sposób wykrywane jest repozytorium i najwyższy poziom działającego drzewa), i mówi Gitowi, że jesteś na najwyższym poziomie działającego drzewa.

Jeśli nie znajdujesz się w katalogu najwyższego poziomu drzewa roboczego, powinieneś powiedzieć Gitowi, gdzie jest najwyższy poziom drzewa roboczego, za pomocą --work-tree=<path>opcji (lub GIT_WORK_TREEzmiennej środowiskowej)

VonC
źródło