Comment parcourir toutes les twigs de git en utilisant le script bash

Comment puis-je parcourir toutes les twigs locales de mon référentiel en utilisant le script bash. J’ai besoin d’itérer et de vérifier s’il y a une différence entre la succursale et certaines twigs distantes. Ex

for branch in $(git branch); do git log --oneline $branch ^remotes/origin/master; done 

Je dois faire quelque chose comme indiqué ci-dessus, mais le problème auquel je suis confronté est que $ (git branch) me donne les dossiers dans le dossier du référentiel avec les twigs présentes dans le référentiel.

Est-ce la bonne façon de résoudre ce problème? Ou existe-t-il une autre façon de le faire?

Je vous remercie

Vous ne devez pas utiliser git branch lors de l’écriture de scripts. Git fournit une interface de «plomberie» 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 pour-chaque-ref :

 git for-each-ref --shell \ --format='git log --oneline %(refname) ^origin/master' \ refs/heads/ 

Remarque: Vous n’avez pas besoin des remotes/ préfixes sur la référence distante à moins que vous ne disposiez d’autres références faisant correspondre l’ origin/master à plusieurs emplacements du chemin de recherche du nom de référence (voir «Nom de référence symbolique…» dans la section Spécification de révisions). git-rev-parse (1) ). Si vous essayez d’éviter toute ambiguïté, optez pour le nom complet de la référence: refs/remotes/origin/master .

Vous obtiendrez une sortie comme ceci:

 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 vers sh .

Si vous n’aimez pas l’idée de générer le code shell, vous pourriez abandonner un peu de 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 de mots du shell (voir git-check-ref-format (1) ). Personnellement, je m’en tiens à l’ancienne version (code shell généré); Je suis plus confiant que rien de déplaisant ne peut arriver.

Puisque vous avez spécifié bash et qu’il prend en charge les tableaux, vous pouvez maintenir la sécurité et éviter de générer les entraves de votre boucle:

 twigs=() eval "$(git for-each-ref --shell --format='twigs+=(%(refname))' refs/heads/)" for branch in "${twigs[@]}"; do # … done 

Vous pourriez faire quelque chose de similaire avec $@ si vous n’utilisez pas un shell qui supporte les tableaux ( set -- to initialize et set -- "$@" %(refname) pour append des éléments).

C’est parce que git branch marque la twig actuelle avec un astérisque, par exemple:

 $ git branch * master mybranch $ 

Ainsi, $(git branch) développe par exemple en * master mybranch , puis le fichier * développe en une liste de fichiers dans le répertoire en cours.

Je ne vois pas d’option évidente pour ne pas imprimer l’astérisque en premier lieu; mais vous pourriez le couper:

 $(git branch | cut -c 3-) 

Je suggère $(git branch|grep -o "[0-9A-Za-z]\+") si vos twigs locales sont nommées par des chiffres, az et / ou AZ seulement