Utilizzare il comando git "log" in un'altra cartella


128

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).

Come posso farlo con il comando shell?


3
cd /other/dir && git log && cd -in shell bash?
Takeshin,

1
Con git 1.8.5 (Q4 2013), avrai un'altra scelta, invece di impostare --git-dir: vedi la mia risposta di seguito
VonC

Risposte:


189

Da man git,:

Puoi farlo con il --git-dirparametro, prima di passare qualsiasi comando.

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

( .gitÈ necessario specificare la directory.) Dalla documentazione :

--git-dir=<path>

Imposta il percorso per il repository. Questo può anche essere controllato impostando la GIT_DIRvariabile d'ambiente. Può essere un percorso assoluto o relativo alla directory di lavoro corrente.


26
Devi fare riferimento alla .gitdirectory. Prova git --git-dir=/foo/bar/.git log.
mipadi,

6
scusa, sbaglio non hai messo il = tra --git-dir e il nome della directory. così diventa git --git-dir / foo / bar log
rgngl il

23
Avvertimento! Questo approccio è rotto per operazioni diverse da log. Prova git --git-dir /foo/someclone/.git status: git diventa totalmente confuso. Raccomando -Ccome indicato di seguito.
Air

Devo ancora imbattermi in una pagina di aiuto di git che include la stringa "--git-dir": '(
thinsoldier

1
@thinsoldier man gitfa sul mio sistema (2.3.5). Ma la risposta @VonC funziona molto meglio.
Calimo,

144

Con git 1.8.5 (Q4 2013) , avrai un'altra scelta, invece di impostare --git-dir.
Se si desidera eseguire git lognella cartella B, digitare:

git -C B log

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


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-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 mostrati sopra sono accettabili per gli script ma sono troppo ingombranti per invocazioni rapide da riga di comando.

Con questa nuova opzione, si può fare quanto sopra 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

19
Questo è un approccio molto più affidabile e funziona con comandi diversi da log.
Air

wow, e niente nella pagina man! Che peccato. (ok, ora lo vedo aggiunto nella pagina man 2.7)
akostadinov il

Purtroppo, questo non è ancora così bello come l' -Ropzione di Mercurial , dal momento che confonde i percorsi relativi. Ad esempio, se digito, git -C subdir log subdir/myfileviene visualizzato un errore (poiché cerca il file subdir/subdir/myfile).
jwd

--git-dir è più maneggevole quando fai qualcosa del genere:for p in (find . -type d -name ".git"); do git --git-dir $p ...; done
shabunc,

1
@jwd: non sono sicuro di come sia un problema? Quello che hai citato è il comportamento preciso che mi aspetterei, e non vorrei gitpensare che fosse più intelligente di me e di ciò che ho scritto. Se dico "esegui questo nella directory X", non intendo "tranne qualche volta, fai qualcos'altro".
underscore_d
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.