¿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 exec
llamada.
¿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 exec
llamada.
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
fatal: Not a git repository (or any of the parent directories): .git
. @Patrick ¿No voté nada?
--work-dir
que creo)
git status
,. -C
Es el camino correcto a seguir.
-C
Opción de uso ( docs ):
git -C /home/repo log
Esto es casi equivalente --git-dir
y --work-tree
sin agregar la .git
carpeta habitual
Editar:
Respuesta rechazada ... bastante sorprendente, ya que, estrictamente hablando, esta es la única respuesta correcta a la pregunta. Las opciones --git-dir
y --work-tree
no 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/subdir
solo:
git -C /home/repo/subdir log .
o
git -C /home/repo log subdir
No es posible usar log .
con --git-dir
o --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-tree
no funciona en absoluto con el log
subcomando 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.
git stash
es otro ejemplo de un subcomando que falla si --git-dir
y --work-tree
se utilizan.
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
¡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
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-prefix
relativo 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
.
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