Utilice el comando git "log" en otra carpeta

128

Tengo algunos archivos php en una carpeta A (que es un proyecto git). En estos archivos php quiero ejecutar "git log" pero para la carpeta B. La carpeta B es otro proyecto de git (por lo que log es diferente entre A y B).

¿Cómo puedo hacer eso con el comando de shell?

Aurélien B
fuente
3
cd /other/dir && git log && cd -en bash shell?
takeshin
1
Con git 1.8.5 (Q4 2013), tendrá otra opción, en lugar de configurar --git-dir: vea mi respuesta a continuación
VonC
Posible duplicado de git pull mientras no está en un directorio git
Code-Apprentice

Respuestas:

189

De man git:

Puede hacer esto con el --git-dirparámetro, antes de pasar cualquier comando.

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

( .gitEs necesario especificar el directorio). De la documentación :

--git-dir=<path>

Establecer la ruta al repositorio. Esto también se puede controlar configurando la GIT_DIRvariable de entorno. Puede ser una ruta absoluta o relativa al directorio de trabajo actual.

rgngl
fuente
26
Tienes que hacer referencia al .gitdirectorio. Tratar git --git-dir=/foo/bar/.git log.
mipadi
66
lo siento, estoy equivocado, no pones el = entre --git-dir y el nombre del directorio. entonces se convierte en git --git-dir / foo / bar log
rgngl
23
¡Advertencia! Este enfoque está roto para operaciones que no sean log. Prueba git --git-dir /foo/someclone/.git status: git se confunde por completo. Recomiendo -Ccomo se indica a continuación.
Aire
Todavía tengo que encontrar una página de ayuda de git que incluya la cadena "--git-dir": '(
thinsoldier
1
@thinsoldier lo man githace en mi sistema (2.3.5). Pero la respuesta de @VonC funciona mucho mejor.
Calimo
144

Con git 1.8.5 (Q4 2013) , tendrá otra opción, en lugar de configurar --git-dir.
Si desea ejecutar git logen la carpeta B, escriba:

git -C B log

Al igual que " make -C <directory>", " git -C <directory> ..." le dice a Git que vaya allí antes de hacer cualquier otra cosa .


Ver commit 44e1e4 de Nazri Ramliy :

Se requieren más pulsaciones de teclas para invocar el comando git en un directorio diferente sin salir del directorio actual:

  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

Los métodos que se muestran arriba son aceptables para las secuencias de comandos, pero son demasiado engorrosos para invocaciones rápidas de la línea de comandos.

Con esta nueva opción, lo anterior se puede hacer con menos pulsaciones de teclas:

  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
fuente
19
Este es un enfoque mucho más confiable y funciona para comandos que no sean log.
Aire
wow, y nada en la página del manual! Qué lástima. (ok, ahora lo veo agregado en la página de manual 2.7)
akostadinov
Lamentablemente, esto todavía no es tan bueno como la -Ropción de Mercurial , ya que desordena los caminos relativos. Por ejemplo, si escribo git -C subdir log subdir/myfileda un error (ya que busca el archivo subdir/subdir/myfile).
jwd
--git-dir es más útil cuando haces algo como esto:for p in (find . -type d -name ".git"); do git --git-dir $p ...; done
shabunc
1
@jwd: ¿No estoy seguro de cómo eso es un problema? Lo que usted citó es el comportamiento preciso que esperaría, y no me gustaría gitpensar que fuera más inteligente que yo y lo que escribí. Si digo 'ejecutar esto en el directorio X', no me refiero a 'excepto a veces, hacer otra cosa'.
underscore_d