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.

1voto

benftwc Points 402

J'utilise une méthode courte pour faire l'affaire, je vous recommande de faire de même car cela pourrait vous faire gagner des heures et vous donner plus de visibilité.

Il suffit d'ajouter le bout de phrase suivant dans votre .bashrc (.bashprofile sur macos).

git-cleaner() { git fetch --all --prune && git branch --merged | grep -v -E "\bmaster|preprod|dmz\b" | xargs -n 1 git branch -d ;};
  1. Récupérer toutes les télécommandes
  2. Obtenir seulement les branches fusionnées de git
  3. Retirer de cette liste les branches "protégées / importantes".
  4. Supprimer le reste (par exemple, les branches propres et fusionnées)

Vous devrez modifier la regex grep afin de l'adapter à vos besoins (ici, elle empêche la suppression de master, preprod et dmz).

1voto

fareed namrouti Points 3830

Cela a marché pour moi :

git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d

1voto

koppor Points 2066

Le vrai défi est lorsque le mainteneur écrase les commits. Alors, les solutions utilisant les fonctionnalités intégrées de git telles que --merged n'est pas utile.

L'outil git-delete-merged-branches permet de supprimer facilement des branches. J'aime particulièrement le mode interactif.

Installation (nécessite python3 ) :

pip install git-delete-merged-branches

Ensuite, exécutez

git-delete-merged-branches --effort=3

--effort=3 est important pour permettre la suppression des branches écrasées.

Alternatives

  • @teppeis/git-delete-squashed : Avec node.js installé, exécutez npx @teppeis/git-delete-squashed . Supports main branche.
  • git-delete-squashed : Non maintenu : Manque la fonctionnalité pour main branche. @teppeis/git-delete-squashed est basé sur cela.

1voto

Cameron Porter Points 218

Aucune des réponses données ici n'a semblé fonctionner pour moi ou faire exactement ce que je voulais (supprimer les branches locales qui ne sont pas dans les branches distantes). J'ai donc écrit ceci, c'est un peu long mais ça marche.

touch /tmp/remote-refs && touch /tmp/local-refs && touch /tmp/diff-refs;
while shortened=$(git for-each-ref refs/remotes) && echo ${${shortened}//"\/remotes\/origin"} > /tmp/remote-refs &&
shortened=$(git for-each-ref refs/heads | grep -v "master\|develop") && echo ${${shortened}//"\/heads"} > /tmp/local-refs &&
diff=$(comm -13 /tmp/remote-refs /tmp/local-refs) && echo ${${diff}##*refs/} > /tmp/diff-refs &&
xargs git branch -D </tmp/diff-refs; do :; done

Il faut juste s'assurer de lancer git remote prune origin premièrement

1voto

aegatlin Points 11
git remote prune origin
git branch -d bug-fix-a bug-fix-b

Le risque d'utiliser des scripts pour ce faire est abordé ici : https://stackoverflow.com/a/47939403/4592031

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