git --git-dir no funciona como se esperaba

209

Estoy tratando de ejecutar git desde un directorio diferente al que estoy. Entonces, por ejemplo, si estoy en:

cd /home/domain/
git status << runs perfect ie
# On branch master
# Your branch is ahead of 'origin/master' by 6 commits.

Entonces ahora quiero ejecutar este comando desde un directorio diferente usando la --git-diropción

Así que digamos que estoy adentro root/e intente esto:

git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

También he tratado de incluir la .gitcarpeta, es decir

git --git-dir="/home/domain/.git/" status

Pero parece que está tratando de ejecutar git desde la raíz, es decir, eliminar todo de mi carpeta de dominio y agregar todo en la raíz.

Espero que alguien pueda aconsejarme sobre lo que estoy haciendo mal.

Sotavento
fuente
44
Ahora tengo el estado funcionando perfecto, pero pull está dando errores. es decir, root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / pull origin master fatal: / usr / local / libexec / git-core / git -pull no se puede usar sin un árbol de trabajo. Pero el estado funciona? alguna idea Jon
Lee
44
Este es el mayor error en git en este momento. No respetar los parámetros --work-tree y / o --git-dir.
Adam Dymitruk
55
A partir de git 1.8.5, tendrá la opción de no configurar --git-diry --work-treepara un comando simple: vea mi respuesta a continuación
VonC

Respuestas:

315

También debe definir el directorio de trabajo. Confuso lo sé, pero es una cuestión de flexibilidad.

git --git-dir=/mycode/.git --work-tree=/mycode status

Puedes leer un poco más aquí.

Jon Gretar
fuente
3
Gracias esto funcionó! De acuerdo en que esto es confuso. Se llama Keep It Simple Stupid. Casi siempre puede permitir flexibilidad al mismo tiempo que proporciona valores predeterminados que tienen más sentido VS tener un comando que no funciona en absoluto.
No,
3
@Nick estuvo de acuerdo, pensarías que si --git-dirno se especifica, comprobaría si /mycode/.gitexistiera y lo usaría antes de arrojar un error.
GP89
44
@NickYeates secundó! También tuve un problema al usar ~ para referirme a mi directorio personal, por ejemplo git --git-dir=~/src/s3cmd/.git --work-tree=~/src/s3cmd pull, no funcionó, pero git --git-dir=/home/username/src/s3cmd/.git --work-tree=/home/username/src/s3cmd pullfuncionó
Jamie Cook
1
Tenga en cuenta que no todos los comandos requieren el árbol de trabajo, por ejemplo, "git --git-dir = / mycode / .git log" funciona bien. Sin embargo, de acuerdo en que esto sea confuso.
yoyo
44
Poca aclaración: git --git-dir="$HOME/foo/.git" --work-tree="$HOME/foo" status
Haris Krajina
136

A partir de git 1.8.5 (que debería salir la próxima semana), será aún más simple:

 git -C "/home/domain/" status

No hay necesidad de configurar --git-diry --work-treemás!


Ver commit 44e1e4 de Nazri Ramliy :

Se necesitan 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-dir=~/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 las 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
44
Me tropecé tratando de usar la bandera -C después del comando git (por ejemplo git status -C <path>, ¡no funcionará!)
Kedar Paranjape
42

Según su comentario anterior, parece que todavía tiene un problema:

root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / pull origin master
fatal: / usr / local / libexec / git-core / git-pull no se puede usar sin un árbol de trabajo

Parece que podría tener la intención de ejecutar esto crontabo algo así. Puede que sea mejor usarlo cdpara cambiar primero a su directorio de trabajo. Por ejemplo:

root @ erx [/] # (cd / home / domain && git pull origin master)

Esto temporalmente (en una subshell, que es lo que hacen los paréntesis) cambiará el directorio actual /home/domainy luego se ejecutará git pull origin master. Una vez que se completa el comando, su directorio actual sigue siendo lo que era antes del comando.

Greg Hewgill
fuente
Usar una subshell es simple y elegante. ¡No sé por qué no pensé en eso antes!
Ehtesh Choudhury
Lo siento @Greg, voté la otra respuesta de Jon al responder a la pregunta formulada, pero creo que estás acertando al detectar y responder la intención y tu comprensión, es decir, el () s, es exactamente lo que estaba buscando +10
Darren Bishop
1
git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

Con Git 2.26 (Q1 2020), la documentación es más clara.

Un efecto de especificar dónde GIT_DIRestá (ya sea con la variable de entorno o con la git --git-dir=<where> cmdopción " ") es deshabilitar el descubrimiento del repositorio .

Esto se ha puesto un poco más de estrés en la documentación, ya que los nuevos usuarios a menudo se confunden.

Ver commit d82ad54 (30 de enero de 2020) por Heba Waly ( HebaWaly) .
(Fusionada por Junio ​​C Hamano - gitster- en commit 17e4a1b , 12 de febrero de 2020)

git: actualice la documentación para --git-dir

Firmado por: Heba Waly
Ayudado por: Junio ​​C Hamano

git --git-dir <path> es un poco confuso y, a veces, no funciona como el usuario esperaría.

Por ejemplo, si el usuario ejecuta git --git-dir=<path> status, git omitirá el algoritmo de descubrimiento de repositorio y asignará el árbol de trabajo al directorio de trabajo actual del usuario a menos que se especifique lo contrario.
Cuando esta asignación es incorrecta, la salida no coincidirá con las expectativas del usuario.

Este parche actualiza la documentación para hacerlo más claro.

Entonces la documentación porgit --git-dir ahora incluye:

--git-dir=<path>:

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

Al especificar la ubicación del " .git" directorio utilizando esta opción (o GIT_DIRvariable de entorno) se desactiva el descubrimiento del repositorio que intenta encontrar un directorio con el .gitsubdirectorio " " (que es cómo se descubren el repositorio y el nivel superior del árbol de trabajo), y le dice a Git que estás en el nivel superior del árbol de trabajo.

Si no está en el directorio de nivel superior del árbol de trabajo, debe decirle a Git dónde está el nivel superior del árbol de trabajo, con la --work-tree=<path>opción (o GIT_WORK_TREEvariable de entorno)

VonC
fuente