1862 votes

Supprimer le suivi des branches qui ne sont plus sur la télécommande

Existe-t-il un moyen simple de supprimer toutes les branches de suivi dont l'équivalent distant n'existe plus ?

Exemple :

Branches (locales et distantes)

  • maître
  • origine/maître
  • origine/bug-fix-a
  • origine/bug-fix-b
  • origine/bug-fix-c

Localement, je n'ai qu'une branche master. Maintenant, je dois travailler sur Correction de bogues - alors je le vérifie, je travaille dessus et j'envoie les changements à la télécommande. Ensuite, je fais la même chose avec bug-fix-b .

Branches (locales et distantes)

  • maître
  • Correction de bogues -
  • bug-fix-b
  • origine/maître
  • origine/bug-fix-a
  • origine/bug-fix-b
  • origine/bug-fix-c

Maintenant, j'ai des succursales locales maître , Correction de bogues - , bug-fix-b . Le responsable de la branche Master va fusionner mes modifications dans maître et supprimer toutes les branches qu'il a déjà fusionnées.

L'état actuel est donc maintenant :

Branches (locales et distantes)

  • maître
  • Correction de bogues -
  • bug-fix-b
  • origine/maître
  • origine/bug-fix-c

Maintenant je voudrais appeler une commande pour supprimer les branches (dans ce cas-ci Correction de bogues - , bug-fix-b ), qui ne sont plus représentés dans le référentiel distant.

Ce serait quelque chose comme la commande existante git remote prune origin mais plutôt git local prune origin .

25 votes

Question très bien formulée avec un exemple très clair. Excellent travail !

3 votes

Pourquoi la majorité des réponses répondent : "Supprimer les branches qui ont été fusionnées", alors que la question porte spécifiquement sur les "branches qui ne sont plus sur la télécommande". C'est une différence assez importante.

10voto

khaoz Points 129

Parce que certaines réponses n'empêchent pas la suppression accidentelle.

git fetch -p && LANG=c git branch -vv | awk '/: gone]/&&!/^\*/{print $1}' | xargs git branch -d

filtrer la branche ayant * dans la première colonne est important.

9voto

thiruclassic Points 71
grep gone <(git branch -v) | cut -d ' ' -f 3 | xargs git branch -d

La commande ci-dessus peut être utilisée pour récupérer les branches qui ont été fusionnées et supprimées dans le système distant et elle supprime la branche locale qui n'est plus disponible dans le système distant.

7voto

Joost den Boer Points 1321

Sur la base des informations ci-dessus, cela a fonctionné pour moi :

git br -d `git br -vv | grep ': gone] ' | awk '{print $1}' | xargs`

Il supprime toutes les branches locales qui sont ': gone] ' sur la télécommande.

7voto

Asaf Points 199

Vous pouvez utiliser ceci :

git fetch --prune

puis

git branch -vv | egrep -v "([origin/[a-zA-Z0-9/_-]+])" | awk "{print $1}" | xargs git branch -D

Il supprime toutes les branches locales qui ne sont pas liées à la branche distante.

5voto

gsnedders Points 2693

S'inspirant largement d'un numéro de autre réponses ici, j'ai obtenu ce qui suit (git 2.13 et plus seulement, je crois), qui devrait fonctionner sur n'importe quel shell de type UNIX :

git for-each-ref --shell --format='ref=%(if:equals=[gone])%(upstream:track)%(then)%(refname)%(end)' refs/heads | while read entry; do eval "$entry"; [ ! -z "$ref" ] && git update-ref -d "$ref" && echo "deleted $ref"; done

Celui-ci utilise notamment for-each-ref au lieu de branch (comme branch est une commande "porcelaine" conçue pour une sortie lisible par l'homme, et non pour le traitement par machine) et utilise sa commande --shell pour obtenir une sortie correctement échappée (cela nous permet de ne pas nous soucier des caractères dans le nom de la référence).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X