2012-03-16 7 views
6

Ho trovato un comportamento particolare con git, e posso riprodurlo ogni volta sulla mia macchina.L'uso di `git --git-dir/percorso/su/git pull/percorso/su/altro/bare-git master` non aggiorna automaticamente la struttura di lavoro. Perchè no?

Se ho due repository locali, uno a nudo all'interno della cartella express.git, e l'altro non-nudo con un albero di lavoro all'interno della espresso cartella, entrambi nella stessa cartella principale, non posso fare il comando git pull ../express.git dall'interno del express cartella. Questo aggiorna automaticamente tutto all'interno di express.

Tuttavia, se faccio funzionare l'ordine git --git-dir /home/cisw470p/stu006/express/.git pull /home/cisw470p/stu006/express.git master da una posizione non si trova in entrambi i repository git, quindi il repo express tirerà le modifiche, ma non aggiornerà automaticamente l'albero di lavoro. Devo quindi eseguire git add . per aggiungere tutte le modifiche e quindi effettuare un altro commit dall'interno di express e ora tutto è buono.

Perché non ha la versione lunga del comando utilizzando l'opzione --git-dir non aggiornare automaticamente l'albero di lavoro per express? C'è una ragione per questo, o ho trovato un bug?

EDIT: Ho appena provato di nuovo ma ho modificato un file diverso e ora ha funzionato. Sono completamente perso.

+0

Come ti aspetti che git trovi l'albero di lavoro con il modulo lungo? Hai provato ad aggiungere il '--work-tree = ...' arg? –

+0

All'interno di 'express' c'è l'albero di lavoro insieme alla cartella' .git', come un normale repository. – trusktr

+0

Quando si dà a 'git' un esplicito git-dir, perché ti aspetti che si assuma solo che il genitore della git dir sia un albero di lavoro? Questa potrebbe essere un'ipotesi piuttosto pericolosa in molti casi (in particolare, se la git dir è in realtà un repository nudo) –

risposta

10

Se si esegue git --git-dir=some/dir/.git pull, per impostazione predefinita git si presuppone che la directory corrente sia l'albero di lavoro. Non è il genitore di some/dir/.git, ma il tuo attuale pwd. Ciò significa che l'esecuzione di quel comando proverà ad aggiornare la directory corrente come se fosse l'albero di lavoro e finirà per scrivere file nel tuo pwd che non appartiene a questo.

La soluzione appropriata è utilizzare il flag --work-tree in combinazione con --git-dir per indicare dove si trova l'albero di lavoro. In questo caso vorrai git --git-dir=some/dir/.git --work-tree=some/dir pull. Tuttavia, dopo la sperimentazione sembra che ci sia un secondo problema qui. Se provi questo comando così com'è, probabilmente ti verrà detto git-pull cannot be used without a working tree. Sembra che il problema qui sia git che il suo albero di lavoro sia un percorso assoluto anziché uno relativo.

Quello che vuoi veramente eseguire è git --git-dir=some/dir/.git --work-tree="$PWD"/some/dir pull. In alternativa, puoi provare semplicemente a cd some/dir && git pull. Se non vuoi cambiare il tuo cwd, puoi racchiuderlo in una subshell, ovvero (cd some/dir && git pull).

+0

Interessante. Utilizzando una subshell lavora alla linea di comando, ma il problema è se faccio '(cd some/dir/.git && git pull)' all'interno di uno script di aggancio non funzionerà e io otterrà un errore che mi diceva no repo git esiste in quella posizione ('fatale: Not a git repository'); lo stesso errore se eseguo il cd sui percorsi assoluti '/ some/repo' o'/some/repo/.git'. Ecco perché ho fatto ricorso a --git-dir e ora --work-tree. Comunque, sto usando percorsi assoluti, e sto ancora ottenendo l'errore 'git-pull non può essere usato senza un errore di working tree'. Il mio percorso inizia con '/', il che significa che è assoluto, giusto? – trusktr

+0

Sì, a partire da un '/' significa che è assoluto. Forse il percorso è sbagliato? Inoltre, dovresti semplicemente usare '(cd alcuni/dir && git pull)', non '(cd alcuni/dir/.git && git pull)'. Se puoi lanciare 'git pull' da quella cartella in un terminale interattivo, dovresti essere in grado di farlo da una subshell in uno script. –

+0

Indipendentemente da ciò, con o senza l'.git nel percorso ottengo lo stesso errore ... vi posterò quando sono tornato da cellulare. E sì, ho controllato tre volte sto digitando il percorso corretto. – trusktr

Problemi correlati