git: arguments vacíos en el gancho post-recepción

Estoy escribiendo bases de gancho post-receive-email script post-receive-email del directory contrib , pero parece que los arguments oldrev y newrev están vacíos.

El script se ve así:

 #!/bin/bash oldrev=$(git rev-parse $1) newrev=$(git rev-parse $2) 

La secuencia de commands se ejecuta en push, pero todos $1 , $2 , $oldrev y $newrev están vacíos. ¿Debo configurar algo para que funcione?

(El repository fue creado por gitolite si importa)

El post-receive no toma ningún argumento. Quoth el manual (énfasis añadido):

Este enganche es invocado por git-receive-pack en el repository remoto, que ocurre cuando se hace un git push en un repository local. Se ejecuta en el repository remoto una vez después de que todos los refs se hayan actualizado.

Este gancho se ejecuta una vez para la operación de recepción. No requiere arguments , pero obtiene la misma información que el gancho pre-receive en su input estándar.

Este enlace no afecta el resultado de git-receive-pack , como se llama después de que se realiza el trabajo real.

Esto reemplaza el gancho post-update en que obtiene los valores antiguos y nuevos de todos los refs además de sus nombres.

Tanto la salida estándar como la salida de error estándar se envían a git send-pack en el otro extremo, por lo que simplemente puede hacer eco de los posts para el usuario.

El enganche post-receive pnetworkingeterminado está vacío, pero hay un script de ejemplo post-receive-email proporcionado en el directory contrib/hooks en la distribución git, que implementa el envío de correos electrónicos de confirmación.

Me encontré con este problema al configurar un server de continuous integration. Dado que los arguments no se pasan a la recepción posterior a través de la línea de command, debe usar el command de lectura. Así es como lo hice:

 #!/bin/sh read oldrev newrev refname BRANCH=${refname#refs/heads/} curl --request POST "http://my.ci.server/hooks/build/myproject_$BRANCH" 

No hay arguments, aunque la información se pasa por STDIN. Para leer esa información de bash simplemente haz esto:

 read oldrev newrev refname echo "Old revision: $oldrev" echo "New revision: $newrev" echo "Reference name: $refname" 

Solo estoy resumiendo las respuestas ya publicadas.

Una versión más elaborada del guión de François sería

 #!/bin/bash JENKINS_URL="http://192.168.1.116/jenkins" GIT_URL="git@bitbucket.org:nuclos/nuclos.git" # remove all spaces and newlines from ARG trim() { local ARG="$1" shift echo -e "$ARG" | tr -d "[:space:]\n" } # unique sort ARG items separated by newlines unique() { local ARG="$1" shift echo -e "$ARG" | sort -u -i } # cut first and last character from ARG cutfl() { local ARG="$1" shift local LEN="${#ARG}" let LEN="$LEN - 2" echo "${ARG:1:$LEN}" } BRANCHES="" while read oldrev newrev refname; do BRANCH=`trim ${refname#refs/heads/}` if [ -n "$BRANCH" ]; then BRANCHES+="${BRANCH}\n" fi done BRANCHES=`unique "$BRANCHES" | tr '\n' ','` BRANCHES=`cutfl "$BRANCHES"` echo wget -q -O - "$JENKINS_URL/git/notifyCommit?url=$GIT_URL&branches=$BRANCHES" at "now + 5 minutes" <<END wget -q -O - "$JENKINS_URL/git/notifyCommit?url=$GIT_URL&branches=$BRANCHES" END 

Esta versión podría hacer frente a más de una sucursal y solo desencadena una compilation para cada uno.

En realidad, no acepto el "no requiere arguments", porque el script de muestra post-receive.sample tiene el siguiente comentario:

 # The "post-receive" script is run after receive-pack has accepted a pack # and the repository has been updated. It is passed arguments in through # stdin in the form # <oldrev> <newrev> <refname> # For example: # aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master