2010-09-22 21 views
71

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 git (por lo que el registro es diferente entre A y B).Usar el comando "log" de git en otra carpeta

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

+2

'cd/otro/dir && git log && cd -' en bash shell? – takeshin

+1

su pregunta no está clara. –

+1

Con git 1.8.5 (Q4 2013), tendrá otra opción, en lugar de establecer '--git-dir': ver [mi respuesta a continuación] (http://stackoverflow.com/a/20115753/6309) – VonC

Respuesta

114

De, man git:

Usted puede hacer esto con el parámetro --git-dir, antes de pasar cualquier comando.

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

(especificando el directorio .git es necesario.) Desde el documentation:

--git-dir=<path>

establecer la ruta al repositorio. Esto también se puede controlar estableciendo la variable de entorno GIT_DIR. Puede ser una ruta absoluta o una ruta relativa al directorio de trabajo actual.

+1

Lo intento pero no funciona:/ – AlphaB

+21

Usted tiene que hacer referencia al directorio '.git'. Pruebe 'git --git-dir =/foo/bar/.git log'. – mipadi

+5

lo siento, mi error es que no pones = entre --git-dir y el nombre del directorio. por lo que se convierte en git --git-dir/foo/bar log – rgngl

83

Con git 1.8.5 (Q4 2013), tendrá otra opción, en lugar de --git-dir.
Si se desea ejecutar en la carpeta git logB, Tipo:

git -C B log 

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


Ver commit 44e1e4 por Nazri Ramliy:

Se necesita más pulsaciones de teclas para invocar comandos 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 mostrados anteriormente son aceptables para secuencias de comandos, pero son demasiado engorroso para invocaciones de línea de comandos rápidos.

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

  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

Este es un enfoque mucho más confiable y funciona para comandos que no sean 'log'. – Air

+0

wow, y nada en la página de manual! Qué lástima (vale, ahora lo veo agregado en la página de 2.7 man) – akostadinov

+0

Lamentablemente, esto es todavía no es tan agradable como la opción '-R' de Mercurial, ya que estropea las rutas relativas. Por ejemplo, si escribo' git -C subdir registro subdir/miarchivo' da un error (ya que busca el archivo 'subdir/subdir/myfile'). – jwd

Cuestiones relacionadas