2010-09-22 14 views
71

Ho alcuni file php in una cartella A (che è un progetto git). In questi file php voglio eseguire "git log" ma per la cartella B. La cartella B è un altro progetto git (quindi il registro è diverso tra A e B).Utilizzare il comando "log" git in un'altra cartella

Come posso farlo con il comando shell?

+2

'cd/altro/dir && git log && cd -' in bash shell? – takeshin

+1

la tua domanda non è chiara. –

+1

Con git 1.8.5 (4 ° trimestre 2013), avrai un'altra scelta, invece di impostare '--git-dir': vedi [la mia risposta sotto] (http://stackoverflow.com/a/20115753/6309) – VonC

risposta

114

Da, man git:

Si può fare questo con il parametro --git-dir, prima di passare qualsiasi comando.

git --git-dir /foo/bar/.git log 

(specificando la directory .git è necessario.) Dal documentation:

--git-dir=<path>

Impostare il percorso del repository. Questo può anche essere controllato impostando la variabile di ambiente GIT_DIR. Può essere un percorso assoluto o un percorso relativo alla directory di lavoro corrente.

+1

Lo provo ma non funziona:/ – AlphaB

+21

Tu fare riferimento alla directory '.git'. Prova 'git --git-dir =/foo/bar/.git log'. – mipadi

+5

scusate, il mio torto non si mette il = tra --git-dir e il nome della directory. quindi diventa git --git-dir/foo/bar log – rgngl

83

Con git 1.8.5 (Q4 2013), si avrà un'altra scelta, invece di impostare --git-dir.
Se si desidera eseguire git log nella cartella B, Tipo:

git -C B log 

Proprio come "make -C <directory>", "git -C <directory> ..." dice Git di andare lì prima di fare qualsiasi altra cosa.


Vedi commit 44e1e4 da Nazri Ramliy:

ci vuole più pressione dei tasti per richiamare il comando git in una directory diversa, senza lasciare la directory corrente:

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-tree=~/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 descritti sopra sono accettabili per scripting ma sono troppo ingombrante per rapide invocazioni linea 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
+11

Questo è un approccio molto più affidabile e funziona per comandi diversi da 'log'. – Air

+0

wow, e niente nella pagina man! Che vergogna. (Ok, ora lo vedo aggiunto in 2.7 man page) – akostadinov

+0

Purtroppo, questo è ancora non abbastanza bello come l'opzione '-R' di Mercurial, dato che incasina i percorsi relativi.Ad esempio, se digito' git -C subdir log subdir/myfile' dà un errore (dato che cerca il file 'sottodir/subdir/myfile'). – jwd

Problemi correlati