2010-09-21 21 views
13

Sto scrivendo il gancio post-ricezione basato sullo script post-receive-email dalla directory contrib, ma sembra che gli argomenti oldrev e newrev siano vuoti.git: argomenti vuoti nel gancio post-ricezione

Lo script si presenta così:

#!/bin/bash 

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

Lo script viene eseguito su spinta, ma tutti $1, $2, $oldrev e $newrev sono vuote. Devo configurare qualcosa per farlo funzionare?

(Il repository è stato creato da gitolite se non importa)

risposta

9

Il gancio post-receive non richiede alcun argomento. Quoth the manual (corsivo):

Questo gancio è richiamato da git-ricevere-pack sul repository remoto, che si verifica quando una spinta git è fatto su un repository locale. Esegue sul repository remoto una volta che tutti gli aggiornamenti sono stati aggiornati.

Questo hook viene eseguito una sola volta per l'operazione di ricezione. Non richiede argomenti, ma ottiene le stesse informazioni dell'ingresso pre-receive sullo standard input.

Questo hook non ha effetto sul risultato di git-receive-pack, come viene chiamato dopo che il lavoro reale è stato eseguito.

Sostituisce il gancio post-update in quanto ottiene oltre ai nomi sia vecchi sia nuovi valori di tutti i ref.

Entrambe le uscite standard e l'uscita errore standard vengono inoltrate a git send-pack all'altra estremità, in modo da poter semplicemente inviare messaggi all'utente.

L'hook predefinito post-receive è vuoto, ma è presente uno script di esempio post-receive-email fornito nella directory contrib/hooks nella distribuzione git, che implementa l'invio di e-mail di commit.

51

Mi sono imbattuto in questo problema durante l'installazione di un server di integrazione continua. Poiché gli argomenti non vengono passati alla post-ricezione tramite la riga di comando, è necessario utilizzare il comando di lettura. Ecco come ho fatto:

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

In realtà, io non accetto il "esso non ha argomenti", perché lo script di esempio di post-receive.sample sta avendo il seguente commento:

# 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

Prende gli argomenti tramite stdin, questo è ciò che è menzionato nella risposta accettata –

+1

Viene anche menzionato nel commento di questo script – sappjw

8

Non ci sono argomenti sebbene le informazioni siano passate su STDIN. Per leggere queste informazioni da bash, fare semplicemente questo:

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

Sto solo riassumendo le risposte già pubblicate.

3

Una versione più elaborata della sceneggiatura François sarebbe

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

Questa versione potrebbe far fronte con più di un ramo e innesca una sola costruire per ciascuno di essi.

Problemi correlati