Use o comando git “log” em outra pasta

127

Eu tenho alguns arquivos php em uma pasta A (que é um projeto git). Nesses arquivos php, quero executar o "git log", mas para a pasta B. A pasta B é outro projeto git (portanto, o log é diferente entre A e B).

Como posso fazer isso com o comando shell?

Aurélien B
fonte
3
cd /other/dir && git log && cd -no shell bash?
takeshin 22/09/10
1
Com o git 1.8.5 (quarto trimestre de 2013), você terá outra opção, em vez de definir --git-dir: veja minha resposta abaixo
VonC:
Possível duplicata do git pull enquanto não estiver em um diretório git #
Code-Apprentice

Respostas:

188

De man git:

Você pode fazer isso com o --git-dirparâmetro, antes de passar qualquer comando.

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

( .gitÉ necessário especificar o diretório.) Na documentação :

--git-dir=<path>

Defina o caminho para o repositório. Isso também pode ser controlado pela configuração da GIT_DIRvariável de ambiente. Pode ser um caminho absoluto ou relativo ao diretório de trabalho atual.

rgngl
fonte
26
Você precisa fazer referência ao .gitdiretório. Tente git --git-dir=/foo/bar/.git log.
Mipadi 22/09/10
6
desculpe, meu erro, você não coloca o = entre --git-dir e o nome do diretório. assim, torna-se git --git-dir / foo / barra de log
rgngl
23
Aviso! Essa abordagem está quebrada para operações diferentes de log. Try git --git-dir /foo/someclone/.git status- git fica totalmente confuso. Eu recomendo -Ccomo observado abaixo.
Air
Ainda tenho que encontrar uma página de ajuda do git que inclua a string "--git-dir": '(
thinsoldier
1
@thinsoldier man gitfaz no meu sistema (2.3.5). Mas a resposta @VonC funciona muito melhor.
Calimo 17/04
144

Com o git 1.8.5 (quarto trimestre de 2013) , você terá outra opção, em vez de definir --git-dir.
Se você deseja executar git logna pasta B, digite:

git -C B log

Assim como " make -C <directory>", " git -C <directory> ..." diz ao Git para ir lá antes de fazer qualquer outra coisa .


Veja commit 44e1e4 de Nazri Ramliy :

É necessário mais pressionamentos de tecla para chamar o comando git em um diretório diferente sem sair do diretório atual:

  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

Os métodos mostrados acima são aceitáveis ​​para scripts, mas são muito pesados ​​para chamadas rápidas da linha de comando.

Com esta nova opção, o acima pode ser feito com menos pressionamentos de tecla:

  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
fonte
19
Essa é uma abordagem muito mais confiável e funciona para outros comandos que não log.
Air
uau, e nada na página de manual! Que pena. (ok, agora eu vê-lo adicionado em 2,7 página man)
akostadinov
Infelizmente, isso ainda não é tão bom quanto a -Ropção do Mercurial , uma vez que atrapalha os caminhos relativos. Por exemplo, se eu digitar git -C subdir log subdir/myfile, gera um erro (já que ele procura o arquivo subdir/subdir/myfile).
jwd
--git-dir é mais prático quando você faz algo parecido com isto:for p in (find . -type d -name ".git"); do git --git-dir $p ...; done
shabunc
1
@jwd: Não sei ao certo como isso é um problema? O que você citou é o comportamento preciso que eu esperaria, e não gostaria gitde pensar que era mais inteligente que eu e o que eu digitei. Se eu disser 'execute isso no diretório X', não quero dizer ', exceto às vezes, faça outra coisa'.
underscore_d