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
No importa ... lo encontré aquí: https://serverfault.com/questions/107608/git-post-receive-hook-with-git-pull-failed-to-find-a-valid-git-directory
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 deGIT_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 delGIT_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 elGIT_DIR
post-receive
comienza con la variable de entornoGIT_DIR
establecida en la carpetarepo/.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 elGIT_DIR
(Gracias a Ulrich Petri por la elegante soluciónenv -i
):
#!/bin/sh
cd ..
env -i git reset --hard