2009-06-18 6 views

risposta

26

Se uno di questi ganci non lo farò io sarei stupito

http://schacon.github.com/git/githooks.html

Forse questo:

post-checkout

Questo hook viene invocato quando a git-checkout viene eseguito dopo aver aggiornato l'albero di lavoro con lo . Il gancio è dato tre parametri: l'arbitro del HEAD precedente, l'arbitro del nuovo HEAD (che possono o non possono essere cambiato), e un flag che indica se l'offerta era una cassa ramo (rami mutevoli , flag = 1) o un file checkout (recupero di un file dall'indice , flag = 0). Questo hook non può influenzare il risultato di git-checkout.

23

Un gancio git è uno script collocato in una posizione speciale del repository, che la posizione è:

.git/ganci

Lo script possono essere di qualsiasi tipo che si può esegui nel tuo ambiente, ad esempio bash, python, ruby, ecc.

Il gancio che viene eseguito dopo un checkout è post-checkout. Dalla documentazione:

... Il gancio è dato tre parametri ...

Esempio:

  1. Creare il gancio (scritto):

    touch .git/hooks/post-checkout 
    chmod u+x .git/hooks/post-checkout 
    
  2. Contenuto campione di aggancio:

#!/bin/bash                  

set -e                   

printf '\npost-checkout hook\n\n'             

prevHEAD=$1                  
newHEAD=$2                  
checkoutType=$3                 

[[ $checkoutType == 1 ]] && checkoutType='branch' ||        
          checkoutType='file' ;         

echo 'Checkout type: '$checkoutType            
echo ' prev HEAD: '`git name-rev --name-only $prevHEAD`      
echo '  new HEAD: '`git name-rev --name-only $newHEAD` 

Nota: La baracca nella prima riga indica il tipo di script.

Questo script (git hook) acquisirà solo i tre parametri passati e li stamperà in un formato di facile utilizzo.

+0

Sei a conoscenza di un modo per dire se questa è la verifica della creazione del ramo (oltre a guardare il nuovo reflog del HEAD)? – pkoch

+0

Sembra che sarebbe una buona idea per te porre una nuova domanda. Se lo fai, inviami il link e vedrò se posso aiutarti. Qual è il problema che stai cercando di risolvere? – givanse

+0

Se un commit è in cima a diversi rami, 'name-rev' dà solo il nome che viene in ordine alfabetico per primo. Quindi, dopo aver verificato un ramo con un nome che precede alfabeticamente il nome del ramo originale, la riga 'prec HEAD' darà il nome del ramo NEW. Una soluzione: 'thisBranchName = $ (git rev-parse --abbrev-ref HEAD); per il ramo in $ (git branch --color = never - contiene $ 1 | sed -e 's /^..//'); do if ["$ (git show-ref -s $ branch)" == $ 1] && ["$ branch"! = "$ thisBranchName"]; quindi parentBranchName = $ branch; interruzione; fi; done' – Ansa211

1

Il post-checkouthook riceve tre parametri:

  1. Rif del precedente capo
  2. Ref di nuovo capo
  3. Se questo è un file di checkout (0) o ramo checkout (1)

È possibile utilizzare il fatto che un ramo creato dall'attuale HEAD avrà lo stesso valore per i parametri 1 e 2.

cat > .git/hooks/post-checkout <<"EOF" 
if [ "$3" == "0" ]; then exit; fi 
if [ "$1" == "$2" ]; then 
    echo "New branch created. (Probably)." 
fi 
EOF 

chmod u+x .git/hooks/post-checkout 

Limitazioni:

  • Verificando un ramo esistente che risulta essere allo stesso HEAD come HEAD corrente ingannare esso.
  • Creazione di un nuovo ramo non dal corrente HEAD non verrà rilevato.
4

Simile ad altri ma verifica che il ramo sia stato estratto una volta.

#!/bin/bash 

# this is a file checkout – do nothing 
if [ "$3" == "0" ]; then exit; fi 

BRANCH_NAME=$(git symbolic-ref --short -q HEAD) 
NUM_CHECKOUTS=`git reflog --date=local | grep -o ${BRANCH_NAME} | wc -l` 

#if the refs of the previous and new heads are the same 
#AND the number of checkouts equals one, a new branch has been created 
if [ "$1" == "$2" ] && [ ${NUM_CHECKOUTS} -eq 1 ]; then 
    git push origin ${BRANCH_NAME} 
fi 
+1

Questo mi ha fatto sulla strada giusta, grazie mille! Dato che il reflog è greppato per contare i checkout, credo che sarebbe stato un getcha se un ramo fosse esistito in precedenza e un nuovo ramo con lo stesso nome fosse stato creato, quel ramo non sarebbe stato riconosciuto come nuovo. Questo potrebbe essere il comportamento desiderato o un problema a seconda del caso d'uso, ma ho appena pensato di parlarne. – Pwnrar

Problemi correlati