55 votos

Escribir un git post-recibir gancho para lidiar con una rama específica

Aquí está mi actual gancho en un desnudo de repo que vive en el servidor de la empresa: git push origin master Este ganchos empuja a Assembla. Lo que necesito es enviar sólo una rama (maestro, idealmente) cuando alguien empuja a los cambios de la rama en nuestro servidor, y de ignorar empuja a otras ramas. Es posible seleccionar la rama de un desnudo de repo y de inserción sólo esa rama Assembla?

239voto

pauljz Puntos 2776

Un post-recibir gancho presenta sus argumentos de stdin, en el formulario <oldrev> <newrev> <refname>. Desde estos argumentos vienen de stdin, no a partir de un argumento de línea de comandos, usted necesita usar read en lugar de $1 $2 $3.

El post-recibir gancho puede recibir varias ramas a la vez (por ejemplo, si alguien hace una git push --all), así que también tenemos que envolver el read en while de bucle.

Un trabajo fragmento se ve algo como esto:

#!/bin/bash
while read oldrev newrev refname
do
    branch=$(git rev-parse --symbolic --abbrev-ref $refname)
    if [ "master" == "$branch" ]; then
        # Do something
    fi
done

6voto

ebneter Puntos 4834

El último parámetro que un post-recibir gancho entra en stdin es lo ref fue cambiado, por lo que es trivial para comprobar si el valor era "refs/heads/master." Un poco de ruby similar a lo que yo uso en un post-recibir gancho:

STDIN.each do |line|
    (old_rev, new_rev, ref_name) = line.split
    if ref_name =~ /master/
         # do your push
    end
end

Tenga en cuenta que se obtiene de una línea para cada ref que fue empujado, por lo que si usted empuja más que maestro, va a funcionar.

2voto

Dean Rather Puntos 7856

Stefan la respuesta no trabajo para mí, pero este lo hizo:

#!/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"

2voto

razvan Puntos 11

Ninguna de las soluciones anteriores funciona para mí. Después de mucho, mucho depuración, resulta que el uso de la 'lectura' comando no funciona-en cambio, el análisis de argumentos de línea de comandos de la forma habitual en que funciona muy bien.

Aquí es exactamente post-actualización de gancho que acabo con éxito probado ahora en CentOS 6.3.

#!/bin/bash

echo "determining branch"

branch=`echo $1 | cut -d/ -f3`

if [ "master" == "$branch" ]; then
    echo "master branch selected"
fi

if [ "staging" == "$branch" ]; then
    echo "staging branch selected"
fi

exec git update-server-info

ACTUALIZACIÓN: en un extraño nota, la pre-recibir gancho tiene su entrada a través de stdin, por lo tanto, leer con 'leer' (wow, nunca pensé que diría esto). El post-actualización de gancho todavía funciona con $1 para mí.

0voto

fotuzlab Puntos 494

Yo había escrito un script de PHP para mí hacer esta funcionalidad.

https://github.com/fotuzlab/githubdump-php

El anfitrión de este archivo en su servidor, de preferencia de repos de la raíz y definir la dirección url en github webhooks. El cambio 'allcommits' en la línea 8 con el nombre de la sucursal y agregar el código de función/en la línea 18.

por ejemplo,

function githubdump($payload_object) {
    // Write your code here.
    exec('git push origin master');
}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X