2010-08-22 17 views
16

Tengo un repositorio git central configurado usando gitolite.Llamar a 'git pull' desde un gancho post-actualización de git

Quiero configurar un gancho de tal manera que cada vez que un usuario empuje al repositorio, realice un pull en otro lugar seguido de algunas pruebas automatizadas.

Hasta ahora, solo quiero que realice la extracción.

En el directorio de ganchos que crean los siguientes nombres de script posterior a la actualización

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

Cuando invoco esta secuencia de comandos con ./post-update, que hace exactamente lo que quiero.

Sin embargo, cada vez que se invoca automáticamente cuando engancho, obtengo: fatal: No es un repositorio de git: '.'

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

+2

acaba de añadir la solución de env -i git 'pull'. – VonC

+0

tienen exactamente el mismo problema, incluso después de 7 años –

Respuesta

25

Usted tiene varios diagnósticos para correr como se sugiere en este SO answer.

En particular, check out the the value of GIT_DIR and GIT_WORK_TREE.

mientras que el gancho se está ejecutando, GIT_DIR y (si el worktree no puede deducirse de GIT_DIR) GIT_WORK_TREE están ajustadas.
Eso significa que su extracción no se ejecutará con el repositorio en el directorio que ha cambiado.


Véase también Entrada de blog Using Git Inside a Git Hook:

Finalmente conseguimos nuestro gurú de Linux una y se dio cuenta de que el entorno en el que se ejecuta el usuario git es totalmente diferente cuando dentro de un gancho.
Gitolite hace un montón de cosas al env, pero la que nos estaba jodiendo era el ajuste del GIT_DIR.
Después nos dimos cuenta de eso, la solución era tan fácil como:

ENV.delete 'GIT_DIR' 

en nuestro ruby ​​script que se desencadena por la 'post-receive' gancho.


Lo mismo pasa en Git Tip: Auto update working tree via post-receive hook, pero con una forma elegante de esto:

La solución?
Resulta que el gancho post-receive comienza con la variable de entorno GIT_DIR establece en la carpeta repo/.git, así que no importa lo que la ruta 'cd' en él siempre tratará de ejecutar las siguientes comandos git no.
La fijación de este es simplemente una cuestión de desarmar las GIT_DIR
(gracias a Ulrich Petri para la solución elegante env -i):

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

Cómo sobre la especificación de la --git-dir.

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

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

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