2016-09-26 2 views
0

Comment puis-je obtenir une liste des branches qui sont poussées dans le contexte d'un pré-crochet? Je sais comment obtenir la branche actuelle, mais elle peut différer de la/des branches poussées.git prepush hook: ramener les branches à

J'ai pensé à analyser la commande, mais je crains d'oublier certains cas. Comme git push, git push origin master permettra à la fois pousser à maîtriser etc.

Répondre

1
while read oldrev newrev refname 
do 
    if [[ "$newrev" != "0000000000000000000000000000000000000000" ]] ; then 
      branch=${refname#refs/heads/} 
    fi 
done 
+1

fermer, mais pas tout à fait à droite: voir l'exemple 'réfs/heads/master 67890 réfs/heads/foreign 12345' dans la section pré-push hook de la documentation de git hooks: https://www.kernel.org/ pub/software/scm/git/docs/githooks.html – torek

+0

On dirait que $ (echo $ {refname # refs/têtes /} | awk '{print $ 1;}') ''le ferait fonctionner – Guig

+0

@Guig: plus simple : 'pendant la lecture refname localhash foreignref foreignhash; fais ... 'Mais tu devrais aussi vérifier que' refname' (que je renommerais comme 'localref') commence vraiment par' refs/heads/', aussi, sinon pousser la balise' v1.2' va essayer de faire quelque chose avec * branche * 'v1.2', qui n'existe probablement pas. – torek

0

est ici une boucle possible, bien que ce n'est pas clair pour moi ce que vous voulez faire avec la branche à distance ou le nom de l'étiquette, et/ou l'arbitre local:

#! /bin/sh 

NULLSHA=0000000000000000000000000000000000000000 # 40 0's 

say() { 
    echo "[email protected]" 1>&2 
} 

while read localref localhash foreignref foreignhash; do 
    case $foreignref in 
    refs/heads/*) 
     reftype=branch 
     shortref=${foreignref#refs/heads/};; 
    refs/tags/*) 
     reftype=tag 
     shortref=${foreignref#refs/tags/};; 
    *) reftype=unknown-ref-type 
     shortref=$foreignref;; 
    esac 
    say "pushing to $reftype $shortref" 
    case $localhash,$foreignhash in 
    $NULLSHA,*) say "(push with intent to delete)";; 
    *,$NULLSHA) say "(push with intent to create)";; 
    *) say "(push with intent to update from $foreignhash to $localhash)" 
     # for branch updates only, let's see if it's a fast-forward 
     if [ $reftype = branch ]; then 
      if git merge-base --is-ancestor $foreignhash $localhash; then 
       say "(this is a fast-forward)" 
      else 
       say "(this can only work if forced)" 
      fi 
     fi;; 
    esac 
done 

(note: ceci n'est pas bien testé).