obteniendo "fatal: no un repositorio git: '.'" cuando se usa el gancho posterior a la actualización para ejecutar 'git pull' en otro repositorio

90

Soy nuevo en git, así que me disculpo (y corríjame) si uso mal la terminología aquí, pero haré todo lo posible.

Estoy tratando de configurar un repositorio git (concentrador) y una copia de trabajo del sitio de desarrollo (principal) en un servidor web. Intenté diseñarlo después de este artículo . Quiero que la copia de trabajo de desarrollo se actualice cada vez que se envíe el repositorio del concentrador. Tengo la impresión de que el gancho adecuado para esto es post-update, que he creado así:

#!/bin/sh
whoami
cd /path/to/working-copy/
RET=`git pull`
echo $RET

Actualizar

Cuando envío cambios desde mi repositorio local al concentrador desnudo, obtengo el siguiente resultado del script posterior a la actualización:

remote: sites
remote: fatal: Not a git repository: '.'

Sin embargo, si entro con SSH al servidor como 'sitios' de usuario y ejecuto este script manualmente, funciona muy bien.

Ty W
fuente

Respuestas:

179

Aquí está el guión que finalmente funcionó. Creo que lo que me faltaba originalmente y que impedía que funcionara de forma remota era elunset GIT_DIR

#!/bin/sh
cd /path/to/working-copy/ || exit
unset GIT_DIR
git pull repo branch

exec git-update-server-info
Ty W
fuente
18
Puedo confirmar, desarmar GIT_DIRsoluciona el problema.
jmtd
16
Para aquellos que quieran entender por qué: es porque git usa la variable en GIT_DIRlugar de PWD. cd-ing cambia el PWDno el GIT_DIR. Debe haber un respaldo en git de GIT_DIRa en PWDcaso de que el primero no esté disponible.
zupa
La pregunta es ¿por qué git debe ver que es necesario hacer esto para el script de gancho (configure GIT_DIR para que incluso el script tenga 'cd' en otro lugar 'git anything' seguirá funcionando)? Personalmente, optaría por que git no haga este tipo de magia.
Steven Haryanto
2
La razón detrás de esto es que Git está aplicando algunas variables de entorno a todos los comandos principales de git.
Casey
¿Qué sucede cuando hay un conflicto de fusión después git pull?
lolololol ol
29

Prueba en su lugar:

#!/bin/sh
cd /path/to/working-copy/
env -i git pull
Geraldo Luis da Silva Ribeiro
fuente
0

A pesar de que GIT_DIR no configurado simplemente funciona.

el problema ocurre cuando configura GIT_DIR incorrectamente en otro lugar.

puede agregar eso en su lugar: GIT_DIR = .git / Funcionará

Zvika Naveh
fuente
0

En mi caso, había especificado un árbol de trabajo, y esto se rompe en algunos comandos, como pull(o más precisamentefetch ).

Para desarmar el árbol de trabajo si está en su configuración de git es a través de:

git config --unset core.worktree

(Hay otras formas de configurar un árbol de trabajo)

Importante tener en cuenta,

No hay casi ningún cambio en que este sea su problema a menos que usted mismo haya cavado este agujero a su alrededor utilizando un árbol de trabajo personalizado en primer lugar.

Broma:

Esto implica para mí que los componentes internos de git usan rutas relativas al árbol de trabajo + .git/en algunos casos. En mi experiencia, los árboles de trabajo no están bien respaldados en absoluto, excepto por las partes más fundamentales de git. No he experimentado a fondo, Git probablemente se comportaría si configuro la variable de configuración del directorio git correctamente, con la que no he jugado.

ThorInvocador
fuente
-1

Probablemente tenga un problema de permisos. No estoy seguro de cómo ha configurado su repositorio git básico, pero si se está ejecutando bajo el gitusuario, asegúrese de que el gitusuario pueda realizar el git pullen el directorio de su proyecto.

Opcionalmente, intente esto para averiguar qué usuario es usted cuando se ejecuta el enlace:

echo `whoami`
Ariejan
fuente
si entro al servidor como usuario de git, puedo usar git pull en el directorio de mi proyecto sin problemas. Yo creo que es el usuario que debe ejecutar el script. Puedo intentar agregar la línea whoami al script, pero ¿a dónde va la salida de ese script cuando se ejecuta como un gancho? ¿Quizás necesito enviar esa salida a un archivo de registro en lugar de hacer eco?
Ty W
¿Qué hace echo `whoami`que whoamino?
Christoffer Hammarström
La salida a stdout desde un script de enlace es visible para el control remoto que realiza la acción. O, en otras palabras, si dice 'git push', la salida de un gancho en el control remoto aparecerá en su stdout.
ebneter
sí, noté eso mientras jugaba con cosas. muy conveniente :)
Ty W