2010-09-21 18 views
13

estoy escribiendo posterior a recibir el gancho basándose en el guión de la post-receive-emailcontrib dir, pero parece que los oldrev y newrev argumentos están vacíos.git: argumentos vacíos en la post-recepción gancho

El guión se parece a esto:

#!/bin/bash 

oldrev=$(git rev-parse $1) 
newrev=$(git rev-parse $2) 

El script se ejecuta en empuje, pero todos $1, $2, $oldrev y $newrev están vacíos. ¿Debo configurar algo para que funcione?

(El repositorio fue creado por gitolite si lo hace materia)

Respuesta

9

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

Este gancho es invocado por git-recibir-pack en el repositorio remoto, lo que ocurre cuando un git push se realiza en un repositorio local. Se ejecuta en el repositorio 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 argumentos, pero obtiene la misma información que el gancho pre-receive en su entrada estándar.

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

Esto reemplaza al 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 mensajes para el usuario.

El valor predeterminado post-receive gancho está vacío, pero hay un script de ejemplo post-receive-email proporcionado en el directorio contrib/hooks en la distribución de Git, al que se aplican el envío de mensajes de correo electrónico comprometerse.

51

Me encontré con este problema al configurar un servidor de integración continua. Dado que los argumentos no se pasan a la recepción posterior a través de la línea de comando, debe usar el comando de lectura. Aquí es cómo lo hice:

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

En realidad, no acepto el "que no tiene argumentos", porque el guión muestra post-receive.sample está teniendo 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 
+4

Se necesita argumentos a través de la entrada estándar, esto es lo que se menciona en la respuesta aceptada –

+1

También se menciona en el comentario de este script – sappjw

8

No hay argumentos, aunque la información se pasa por STDIN. Para leer dicha información de fiesta simplemente hacer esto:

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

sólo estoy resumiendo las respuestas ya publicadas.

3

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

#!/bin/bash 

JENKINS_URL="http://192.168.1.116/jenkins" 
GIT_URL="[email protected]: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 rama y sólo desencadena puede construirse para cada uno.

Cuestiones relacionadas