2011-05-12 14 views
15

Tengo un post recibir configuraciones gancho en el repositorio remoto que intenta determinar el nombre de la rama de la presión de entrada de la siguiente manera:No es capaz de detectar la rama de Git posterior a recibir el gancho

$branch = `git rev-parse --abbrev-ref HEAD` 

Lo que Sin embargo, estoy descubriendo que no importa qué rama presiono desde mi variable $ branch se establece con 'master'.

¿Alguna idea?

Respuesta

24

El enganche posterior a la recepción obtiene los mismos datos que el pre-recibido y no como argumentos, sino de stdin. La siguiente es enviado a todos los árbitros:

OLDREV (espacio) NEWREV (espacio) RefName (salto de línea)

Se podría analizar la ref name con este script bash:

while read oldrev newrev ref 
do 
    echo "$ref" 
done 
+0

perfecta, esto es exactamente lo que necesitaba. ¡Gracias! – jsleeuw

+2

excepto que si 'post-receive' recibe un' git push --tags' por ejemplo (y probablemente 'git push origin my_tagname') entonces el' ref' que obtendrás es 'refs/tags/my_tagname' y * not * 'refs/branch/my_branchname' – iainH

1

Debe leer los argumentos que se pasan al script. Debe tener el nombre de la sucursal y las revisiones nuevas y antiguas, y ejecutarse para cada rama presionada

2

Magnus solución no funcionó para mí, pero this hicieron:

#!/bin/bash 

echo "determining branch" 

if ! [ -t 0 ]; then 
    read -a ref 
fi 

IFS='/' read -ra REF <<< "${ref[2]}" 
branch="${REF[2]}" 

if [ "master" == "$branch" ]; then 
    echo 'master was pushed' 
fi 

if [ "staging" == "$branch" ]; then 
    echo 'staging was pushed' 
fi 

echo "done" 
+1

Eso es porque estás buscando la palabra master, pero lo que recibiste fue refs/head/master. Usando read, convirtió la cadena en una matriz delimitada por '/'. Luego sacaste el valor. –

+0

Hola ¿Puedes ayudarnos a agregar la condición 'y' en' if' como 'if [" master "==" $ branch "&&" development "==" $ branch "]'. Cómo usar y condicionar en esto si está enganchado. Gracias por adelantado. – Foolish

2

Ambas respuestas son correctas, pero yo estaba teniendo problemas para conseguir la entrada estándar a la siguiente función común post-recibir-emai l. Esto es lo que terminé con:

read oldrev newrev ref 
echo "$oldrev" "$newrev" "$ref" | . /usr/share/git-core/contrib/hooks/post-receive-email 


if [ "refs/heads/qa" == "$ref" ]; then 
    # Big Tuna YO! 
    wget -q -O - --connect-timeout=2 http://127.0.0.1:3000/hooks/build/qa_now 
fi 
10

También podría hacer algo como esto utilizando fiesta de la sustitución de variables:

read oldrev newrev ref 

branchname=${ref#refs/heads/} 

git checkout ${branchname} 
+0

Perfecto, y luego combine con el ciclo de @ ralphtheninja para leer todo cuando se empujan múltiples ramas –

Cuestiones relacionadas