git --git-dir non funziona come previsto


209

Sto cercando di eseguire git da una directory diversa da quella in cui mi trovo. Ad esempio, se mi trovo in:

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

Quindi ora voglio eseguire questo comando da una directory diversa usando l' --git-diropzione.

Quindi diciamo che ci sono root/e prova questo:

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

Ho anche provato ad includere la .gitcartella cioè

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

Ma sembra che stia provando a eseguire git dal root, cioè eliminando tutto dalla mia cartella di dominio e aggiungendo tutto in root.

Spero che qualcuno possa consigliarti su cosa sto facendo di sbagliato.


4
Ora lo stato funziona perfettamente, ma pull sta dando errori. cioè root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / pull origin master fatale: / usr / local / libexec / git-core / git -pull non può essere usato senza un albero funzionante. Ma lo stato funziona ?? qualsiasi idea Jon
Lee,

4
Questo è il più grande bug in git in questo momento. Non rispettando i parametri --work-tree e / o --git-dir.
Adam Dymitruk,

5
A partire da git 1.8.5, avrai la scelta di non impostare --git-dire --work-treeper un semplice comando: vedi la mia risposta di seguito
VonC

Risposte:


315

Devi anche definire la directory di lavoro. Confuso, lo so, ma è una cosa flessibile.

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

Puoi leggere un po 'di più qui


3
Grazie ha funzionato! Concordato che questo è confuso. Si chiama Keep It Simple Stupid. Puoi quasi sempre consentire la flessibilità e allo stesso tempo dare le impostazioni predefinite che hanno più senso VS avere un comando non funziona affatto.
No

3
@Nick concordato, penseresti che se --git-dirnon fosse specificato, verificherebbe se /mycode/.gitesistesse e lo userebbe prima di lanciare un errore.
GP89,

4
@NickYeates distaccato! Inoltre ho avuto un problema durante l'utilizzo di ~ per fare riferimento alla mia home directory, ad esempio git --git-dir=~/src/s3cmd/.git --work-tree=~/src/s3cmd pullnon ha funzionato ma git --git-dir=/home/username/src/s3cmd/.git --work-tree=/home/username/src/s3cmd pullha funzionato
Jamie Cook,

1
Si noti che non tutti i comandi richiedono l'albero di lavoro, ad esempio "git --git-dir = / mycode / .git log" funziona correttamente. Concordato sul fatto che questo sia confuso però!
yoyo

4
Piccoli chiarimenti: git --git-dir="$HOME/foo/.git" --work-tree="$HOME/foo" status
Haris Krajina,

136

A partire da git 1.8.5 (che dovrebbe uscire la prossima settimana), sarà ancora più semplice:

 git -C "/home/domain/" status

Non c'è bisogno di impostare --git-dire --work-treepiù!


Vedi commit 44e1e4 di Nazri Ramliy :

Sono necessari più tasti per richiamare il comando git in una directory diversa senza uscire dalla directory corrente:

  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

I metodi sopra indicati sono accettabili per gli script ma sono troppo ingombranti per invocazioni rapide da riga di comando.

Con questa nuova opzione, quanto sopra può essere fatto con un minor numero di tasti:

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done

4
Sono stato inciampato mentre cercavo di usare la bandiera -C dopo il comando git (ad es. git status -C <path>Non funzionerà!)
Kedar Paranjape

42

Sulla base del tuo commento sopra, sembra che tu stia ancora riscontrando un problema:

root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / pull origin master
fatale: / usr / local / libexec / git-core / git-pull non può essere usato senza un albero di lavoro

Sembra che tu abbia intenzione di far partire questo crontabo qualcosa del genere. Potrebbe essere meglio usare cdper passare prima alla directory di lavoro. Per esempio:

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

Questo cambierà temporaneamente (in una subshell, che è quello che fanno le parentesi) la directory corrente /home/domain , quindi eseguita git pull origin master. Al termine del comando, la directory corrente rimane quella che era prima del comando.


L'uso di una subshell è semplice ed elegante. Non so perché non ci abbia pensato prima!
Ehtesh Choudhury,

Mi dispiace @Greg, hai votato l'altra risposta di Jon mentre ha risposto alla domanda posta - ma penso che tu sia preciso nel riconoscere e rispondere all'intenzione e alla tua intuizione, ad esempio il () s, è esattamente quello che stavo cercando +10
Darren Bishop,

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

Con Git 2.26 (Q1 2020), la documentazione è più chiara.

Un effetto di specificare dove si GIT_DIRtrova (con la variabile di ambiente o con l' git --git-dir=<where> cmdopzione " ") è disabilitare il rilevamento del repository .

Ciò è stato posto un po 'più di stress nella documentazione, poiché i nuovi utenti spesso vengono confusi.

Vedi commit d82ad54 (30 gennaio 2020) di Heba Waly ( HebaWaly) .
(Unita da Junio ​​C Hamano - gitster- in commit 17e4a1b , 12 feb 2020)

git: aggiorna la documentazione per --git-dir

Firmato-fuori: Heba Waly
Aiutato: Junio ​​C Hamano

git --git-dir <path> è un po 'confuso e a volte non funziona come dovrebbe aspettarsi l'utente.

Ad esempio, se l'utente esegue git --git-dir=<path> status, git salterà l'algoritmo di individuazione del repository e assegnerà l'albero di lavoro alla directory di lavoro corrente dell'utente, se non diversamente specificato.
Quando questa assegnazione è errata, l'output non corrisponderà alle aspettative dell'utente.

Questa patch aggiorna la documentazione per renderla più chiara.

Quindi la documentazione pergit --git-dir ora include:

--git-dir=<path>:

Impostare il percorso sul repository (" .git" directory).
Questo può anche essere controllato impostando la GIT_DIRvariabile d'ambiente.
Può essere un percorso assoluto o relativo alla directory di lavoro corrente.

Specificando la posizione della " .git" directory usando questa opzione (o GIT_DIRvariabile d'ambiente) si disattiva il rilevamento del repository che tenta di trovare una directory con " .git" sottodirectory (che è come vengono scoperti il ​​repository e il livello superiore dell'albero di lavoro), e dice a Git che sei al livello più alto dell'albero di lavoro.

Se non ti trovi nella directory di livello superiore dell'albero di lavoro, dovresti dire a Git dove si trova il livello superiore dell'albero di lavoro, con l' --work-tree=<path>opzione (o GIT_WORK_TREEla variabile di ambiente)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.