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.

65voto

karlingen Points 975

J'ai trouvé la réponse ici : Comment puis-je supprimer toutes les branches git qui ont été fusionnées ?

git branch --merged | grep -v "\*" | xargs -n 1 git branch -d

Assurez-vous que nous gardons le maître

Vous pouvez vous assurer que master ou toute autre branche d'ailleurs, n'est pas supprimée par l'ajout d'une autre branche. grep après le premier. Dans ce cas, vous feriez :

git branch --merged | grep -v "\*" | grep -v "YOUR_BRANCH_TO_KEEP" | xargs -n 1 git branch -d

Donc si nous voulions garder master , develop y staging par exemple, nous irions :

git branch --merged | grep -v "\*" | grep -v "master" | grep -v "develop" | grep -v "staging" | xargs -n 1 git branch -d

Faites-en un alias

Comme il est un peu long, vous pourriez ajouter un alias à votre fichier .zshrc o .bashrc . Le mien s'appelle gbpurge (pour git branches purge ) :

alias gbpurge='git branch --merged | grep -v "\*" | grep -v "master" | grep -v "develop" | grep -v "staging" | xargs -n 1 git branch -d'

Ensuite, rechargez votre .bashrc o .zshrc :

. ~/.bashrc

ou

. ~/.zshrc

50voto

Sven Dhaens Points 376

Tu pourrais faire ça :

git branch -vv | grep 'origin/.*: gone]' | awk '{print $1}' | xargs git branch -d

P.S. : comme l'a souligné Sam H.

exécutez d'abord ceci :

git remote prune origin

48voto

Mailo Points 978

Il semble que la solution soit ici - http://stackoverflow.com/a/1072178/133986

En bref, git remote prune fait la magie

45voto

noraj Points 727

TL;DR :

Supprimez TOUTES les branches locales qui ne sont pas sur le site distant

git fetch -p && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -D

Supprimez TOUTES les branches locales qui ne sont pas sur le distant ET qui sont entièrement fusionnées ET qui ne sont pas utilisées. comme cela a été dit dans de nombreuses réponses auparavant.

git fetch -p && git branch --merged | grep -v '*' | grep -v 'master' | xargs git branch -d

Explication

  • git fetch -p va élaguer toutes les branches qui n'existent plus sur le site distant.
  • git branch -vv imprimera les branches locales et la branche élaguée sera marquée avec gone
  • grep ': gone]' sélectionne uniquement les branches qui sont parties
  • awk '{print $1}' filtrer la sortie pour afficher uniquement le nom des branches
  • xargs git branch -D va boucler sur toutes les lignes (branches) et forcer la suppression de cette branche

Pourquoi git branch -D et non git branch -d autre que vous aurez pour les branches qui ne sont pas entièrement fusionnées.

error: The branch 'xxx' is not fully merged.

43voto

Patrick Quirk Points 4551

La correspondance des motifs pour "gone" dans la plupart des autres solutions m'a fait un peu peur. Pour être plus sûr, cette solution utilise le --format pour extraire les données de chaque branche statut de suivi en amont .

J'avais besoin d'une version adaptée à Windows, donc ceci supprime toutes les branches qui sont listées comme "parties" en utilisant Powershell :

git branch --list --format "%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)" | 
    ? { $_ -ne "" } | 
    % { git branch -D $_ }

La première ligne liste le nom des branches locales dont la branche amont est "gone". La ligne suivante supprime les lignes vides (qui sont des sorties pour les branches qui ne sont pas "gone"), puis le nom de la branche est passé à la commande pour supprimer la branche.

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