2010-08-10 6 views
6

Estoy usando git con trac. Después de empuje Quiero dos que hay que hacer:múltiples comandos no funcionan en git post-receive

  1. el envío de correo electrónico a equipo de desarrollo con Diff
  2. Si hay alguna frase especial en cometer mensaje (como "ver # 1"), entonces yo quiero que el mensaje de entrega para ser colocado en el boleto de trac.

Lo primero es resuelto por git-commit-notifier. Funciona perfectamente después de haber creado después de la recepción de gancho:

 
#!/bin/sh 

/var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml 

Mi segundo requisito puede ser resuelto según lo descrito en http://trac-hacks.org/wiki/GitPlugin#post-receivehookscripts. También funciona perfectamente con dicho gancho post-recepción:

 
#!/bin/sh 

/var/trac/testgit/commit-updater 

Ambas cosas funcionan cuando están separadas. Pero necesito combinarlos. Así que he creado gancho post-recepción:

 
#!/bin/sh 

/var/trac/testgit/commit-updater 
/var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml 

Es muy divertido, pero esto no está funcionando. Los comandos se ejecutan perfectamente bien cuando se ejecutan por separado, pero solo el primero funciona cuando se colocan en el gancho posterior a la recepción.

Si tengo tales gancho:

 
#!/bin/sh 

/var/trac/testgit/commit-updater 
/var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml 

hago recibir el siguiente error

 
/var/lib/gems/1.8/gems/git-commit-notifier-0.8.0/bin/git-commit-notifier:12: undefined method `strip' for nil:NilClass (NoMethodError) 
     from /var/lib/gems/1.8/bin/git-commit-notifier:19:in `load' 
     from /var/lib/gems/1.8/bin/git-commit-notifier:19 

Pero si cambio de orden de este 2 comandos no recibo ningún error, pero sólo el primer comando funciona.

Agradeceré cualquier ayuda. Intento resolver este problema por mucho tiempo y no tengo ideas.

+0

@bessarabov: Parece que intenta leer de STDIN, pero no puede, presumiblemente porque la primera línea lo está leyendo todo. – ngoozeff

+0

Si ngoozeff es correcto, haga que su gancho copie su stdout en un archivo temporal, y luego redirija ese archivo temporal a cada uno de los dos comandos. – bstpierre

+0

@ngoozeff ¡gracias! tu sugerencia es 100% correcta =) ¡Con la ayuda de @bstpierre todo está funcionando ahora! – bessarabov

Respuesta

5

Suponiendo que mi comentario es correcto, y commit-updater está comiendo todos stdin, esto debería hacer el truco:

#!/bin/sh 

FILE=`mktemp` 
cat - > $FILE 
cat $FILE | /var/trac/testgit/commit-updater 
cat $FILE | /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml 
rm $FILE 
+0

¡Gracias! Lo único que tuve que cambiar en su secuencia de comandos es eliminar las comillas: ARCHIVO = mktemp Y después de eso, funciona perfectamente =) – bessarabov

+0

@bessarabov: eliminó los backticks. gracias – ngoozeff

+3

los backticks son necesarios, de lo contrario se obtiene "mktemp" como nombre de archivo. – cweiske

1

He encontrado la solución de ngoozeff útil, pero tenía que hacer algunas adiciones. Al principio, la secuencia de comandos debería fallar si uno de los ganchos falla. En el segundo, algunos ganchos pueden esperar argumentos. En mi caso, el gancho de Gitzilla era así.

Para mí Esta trabajaron para combinar gitzilla y gitolite ganchos:

#!/bin/sh 

FILE=`mktemp` 
cat - > $FILE 
cat $FILE | $GIT_DIR/hooks/update.gitzilla $* || exit 1 
cat $FILE | $GIT_DIR/hooks/update.gitolite $* || exit 1 
rm $FILE 

Nota del los estados de salida y $ *. También puede usar la variable $ GIT_DIR. Los archivos update.gitzilla y update.gitolite son enlaces simbólicos.

1

Una alternativa al uso de un archivo sería:

#!/bin/sh 

while read oldrev newrev refname 
do 
    echo $oldrev $newrev $refname | /var/trac/testgit/commit-updater 
    echo $oldrev $newrev $refname | /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml 
done 

Fuente: http://mmm.beachtemple.com/blog/2009/04/06/git-post-receive-hook/

+0

Esto no funcionaría bien con correos, p. Ej. llamando a/usr/share/git-core/contrib/hooks/post-receive-email, porque se crea un nuevo proceso para cada línea de entrada, por lo que podría crear tantos correos electrónicos. –

0

Dado que los datos de entrada no es tan enorme, se puede ir sin archivo temporal y guarda los datos en la cáscara :

#!/bin/sh 

refs=$(cat) 
/var/trac/testgit/commit-updater <<END 
$refs 
END 
/var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml <<END 
$refs 
END 
Cuestiones relacionadas