¿Cómo ejecuto un comando Git sin estar en el repositorio?

131

¿Hay alguna manera de ejecutar comandos Git contra un repositorio sin estar en ese repositorio?

Por ejemplo algo como esto git /home/repo log:?

Por favor no me digas que lo haga cd. Estoy haciendo esto a través de una execllamada.

Torre
fuente
3
¿No puedes simplemente "cd / home / repo && git log" como tu llamada ejecutiva?
Alex Howansky
Tengo algunos problemas raros con eso. Estoy comenzando un nuevo proceso, no realmente un ejecutivo, pero no sé cuánto difieren. Me resulta más fácil encontrar un parámetro para especificar el directorio git.
Torre
1
Posible duplicado de git pull mientras no está en un directorio git
Trevor Boyd Smith
1
git --git-dir = / home / repo / .git log
Atiq Ur Rehman

Respuestas:

102

Tratar:

git --git-dir=/home/repo/.git log

Es importante dar la ruta hasta el directorio .git de su repositorio. De lo contrario, solo recibirá un mensaje de error que dice algo como:

fatal: Not a git repository
max
fuente
2
Sigo recibiendo fatal: Not a git repository (or any of the parent directories): .git. @Patrick ¿No voté nada?
Torre
3
@Patrick La respuesta fue editada (originalmente decía --work-dirque creo)
Gareth
1
Esto no funcionó para mí, ya que mostraba todos los archivos de la confirmación como eliminados. Parece que está comprobando la confirmación pero no el contenido de la carpeta. Consulte la respuesta de @calandoa para un mejor rendimiento.
mxcd
2
No funcionó para mí usando el último git, sin embargo, usando la opción -C funcionó, por ejemplo: git -C /home/repo/.git log
D.Snap
1
esto en realidad no funcionó como se esperaba. ¿Por qué esta es una respuesta aceptada? Esto usará el directorio actual como árbol de trabajo y usará el .git especificado para el historial, lo cual es completamente incorrecto. Si no solo muestra log, por ejemplo git status,. -CEs el camino correcto a seguir.
Wang
218

-COpción de uso ( docs ):

git -C /home/repo log

Esto es casi equivalente --git-diry --work-treesin agregar la .gitcarpeta habitual

Editar:

Respuesta rechazada ... bastante sorprendente, ya que, estrictamente hablando, esta es la única respuesta correcta a la pregunta. Las opciones --git-diry --work-treeno existen para acceder al repositorio desde fuera del árbol de trabajo, se utilizan para mover el.git otro lugar, y son mucho más complicados de usar en algunos casos.

Por ejemplo, para obtener el registro de /home/repo/subdirsolo:

git -C /home/repo/subdir log .

o

git -C /home/repo log subdir

No es posible usar log .con --git-diro --work-tree. La ruta debe procesarse para extraer la ruta secundaria en relación con la parte superior del árbol de trabajo, e incluso en ese caso, git no la reconocerá como ruta si no usa la --opción, por lo que la única forma posible es:

git --git-dir /home/repo/.git log -- subdir

Además, --work-treeno funciona en absoluto con el logsubcomando de mi versión (git 1.9.1). Simplemente se ignora:

git --git-dir /home/repo/.git --work-tree /home/repo/subdir log -- subdir
git --git-dir /home/repo/.git --work-tree /home/repo/whatever log -- subdir

Ni siquiera entiendo si esto es un error o una característica ... como de costumbre con muchas opciones de diseño de git.

calandoa
fuente
Gracias por agregar una explicación adicional.
Erick G. Hagstrom
git stashes otro ejemplo de un subcomando que falla si --git-diry --work-treese utilizan.
d5ve
44
La opción -C se agregó en la versión 1.8.5 de git, que se lanzó en 2013.
d5ve
-C funcionó mejor que --git-dir para mí ... -C respeta la configuración de configuración de git para el repositorio. Postulo versión git 1.9.5.msysgit.1
Straff
@calandoa qué siempre tenemos que especificar la ubicación de la raíz, una cosa más, si el nombre de la cesión temporal contiene varias palabras ¿Cómo podemos poner en en este código
Kasun Siyambalapitiya
17

De hecho, necesitas usar --git-dir y --work-tree juntos. Aquí hay un ejemplo:

local [] Desktop: mkdir git
local [] Desktop: cd git
local [] git: touch README.txt
local [] git: git init
Initialized empty Git repository in /Users/albert/Desktop/git/.git/
local [] git: cd ..
local [] Desktop: git --work-tree=git --git-dir=git/.git add .
local [] Desktop: git --work-tree=git --git-dir=git/.git commit -a -m 'initial commit, called from outside the git directory'
[master (root-commit) ee951b1] initial commit, called from outside the git directory
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.txt
local [] Desktop: cd git
local [] git: git log --pretty=oneline
ee951b161053e0e0948f9e2a36bfbb60f9c87abe initial commit, called from outside the git di
alberto56
fuente
1
Esto es más correcto que la respuesta con --git-dir solo. git-scm.com/blog/2010/04/11/environment.html
Erick G. Hagstrom
11

¡He intentado muchas veces! ¡Finalmente lo entendí!

git -C dir --no-pager log --format='%an' -1 filename

recuerde, por favor no agregue .git a su

-C dir

penny chan
fuente
3

Esto es similar a la respuesta de @ max. Desafortunadamente, --git-dir no hizo lo que necesitaba. editar En retrospectiva, otra respuesta [anterior] que no había leído sugería usar --work-tree. No estoy seguro de si usar el entorno o las banderas es más apropiado, así que dejaré mi respuesta en caso de que alguien encuentre uso en él, pero cambiaré a usar --work-tree/ --git-dir.


Hay dos repositorios, uno dentro del otro pero no un submódulo; el repositorio externo lo ignora:

tools (outer repo)
  gcc/4.9.2 (inner repo)

Lo que quería era la salida de git rev-parse --show-prefixrelativo al repositorio externo. Esto es lo que se me ocurrió (sintaxis bash; dividir entre líneas para facilitar la lectura):

prefix_dir=$(cd ..; git rev-parse --show-toplevel)
prefix_dir=$(GIT_WORK_TREE=${prefix_dir} git rev-parse --show-prefix)

Cuando se ejecuta desde 4.9.2 produce la cadena gcc/4.9.2.

Brian Vandenberg
fuente
1

Para cualquier comando git, puedes hacer:

git --git-dir=<PATH-TO-REPO>/.git --work-tree=<PATH-TO-REPO> <git-command>

Por ejemplo, si quieres hacer un estado git:

 git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  status

o si desea verificar la sucursal en la que se encuentra el repositorio:

git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  rev-parse --abbrev-ref HEAD
Paula
fuente