changes all git shell githooks

all - git push changes



Llamando a ''git pull'' desde un gancho de actualización de git (4)

Tengo un repositorio central de git configurado con gitolita.

Quiero configurar un gancho de tal manera que cada vez que un usuario empuja al repositorio, realice un tirón en otro lugar seguido de algunas pruebas automatizadas.

Hasta ahora, solo quiero que realice el tirón.

En el directorio de ganchos creé los siguientes nombres de script posteriores a la actualización:

#!/bin/sh cd /home/git/www/epicac git pull

Cuando invoco este script usando ./post-update, hace exactamente lo que quiero.

Sin embargo, cada vez que se invoca automáticamente cuando engancho, me sale: fatal: no es un repositorio git: ''''.

¿Alguna idea de por qué esto podría estar sucediendo?


¿Qué hay de especificar el --git-dir .

#!/bin/sh cd /home/git/www/epicac git --git-dir=.git pull


Esto debería hacer el truco en una sola línea:

git -C /home/git/www/epicac pull



Tiene varios diagnósticos para ejecutar como se sugiere en esta respuesta SO .

En particular, revisa el valor de GIT_DIR y GIT_WORK_TREE .

Mientras se ejecuta el gancho, GIT_DIR y (si el árbol de trabajo no se puede inferir de GIT_DIR ) GIT_WORK_TREE están configurados.
Eso significa que su extracción no se ejecutará con el repositorio en el directorio al que cambió.

Véase también la publicación del blog Using Git Inside a Git Hook :

Finalmente, superamos a nuestro gurú de linux y notó que el entorno en el que se ejecuta el usuario de git es totalmente diferente cuando está dentro de un gancho.
Gitolite hace un montón de cosas para el env, pero la que nos estaba jodiendo era la configuración del GIT_DIR .
Después de que descubrimos eso, la solución fue tan fácil como:

ENV.delete ''GIT_DIR''

en nuestro script ruby ​​que se activa con el post-receive '' post-receive ''.

La misma oferta en Git. Sugerencia: árbol de trabajo de actualización automática a través del enlace posterior a la recepción , pero con una forma elegante de salir de esto:

¿La solución?
Resulta que el GIT_DIR post-receive comienza con la variable de entorno GIT_DIR establecida en la carpeta repo/.git , por lo que no importa en qué ruta ''cd'' siempre intentará ejecutar los siguientes comandos de git allí .
Arreglar esto es simplemente una cuestión de desestabilizar el GIT_DIR
(Gracias a Ulrich Petri por la elegante solución env -i ):

#!/bin/sh cd .. env -i git reset --hard