Vous ne devez pas utiliser git branch lors de l'écriture de scripts. Git fournit une interface de «plomberie» qui est explicitement conçue pour être utilisée dans les scripts (de nombreuses implémentations actuelles et historiques des commandes Git normales (ajout, extraction, fusion, etc.) utilisent cette même interface).
La commande de plomberie que vous voulez est git for-each-ref :
git for-each-ref --shell \
--format='git log --oneline %(refname) ^origin/master' \
refs/heads/
Remarque: Vous n'avez pas besoin du remotes/
préfixe sur la référence distante, sauf si vous avez d'autres références qui font origin/master
correspondre plusieurs endroits dans le chemin de recherche du nom de référence (voir «Un nom de référence symbolique.…» Dans la section Spécification des révisions de git-rev-parse (1) ). Si vous essayez d'éviter l' ambiguïté explictly, puis aller avec le nom complet ref: refs/remotes/origin/master
.
Vous obtiendrez une sortie comme celle-ci:
git log --oneline 'refs/heads/master' ^origin/master
git log --oneline 'refs/heads/other' ^origin/master
git log --oneline 'refs/heads/pu' ^origin/master
Vous pouvez diriger cette sortie dans sh .
Si vous n'aimez pas l'idée de générer le code shell, vous pouvez renoncer un peu à la robustesse * et faire ceci:
for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do
git log --oneline "$branch" ^origin/master
done
* Les noms de référence doivent être protégés du fractionnement des mots du shell (voir git-check-ref-format (1) ). Personnellement, je m'en tiendrai à l'ancienne version (code shell généré); Je suis plus convaincu que rien d'inapproprié ne peut en résulter.
Puisque vous avez spécifié bash et qu'il prend en charge les tableaux, vous pouvez maintenir la sécurité tout en évitant de générer les tripes de votre boucle:
branches=()
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)"
for branch in "${branches[@]}"; do
# …
done
Vous pouvez faire quelque chose de similaire avec $@
si vous n'utilisez pas de shell prenant en charge les tableaux ( set --
pour initialiser et set -- "$@" %(refname)
ajouter des éléments).