Je ne répondrais pas normalement à une question qui a déjà 16 réponses, mais toutes les autres réponses sont fausses, et la bonne réponse est si simple. La question dit: "Existe-t-il un moyen simple de supprimer toutes les branches de suivi dont l'équivalent distant n'existe plus?"
Si «simple» signifie les supprimer tous en une seule fois, ni fragiles, ni dangereux, et sans dépendre d'outils que tous les lecteurs n'auront pas, alors la bonne réponse est: non.
Certaines réponses sont simples, mais elles ne font pas ce qui a été demandé. D'autres font ce qui a été demandé, mais ne sont pas simples: tous reposent sur l'analyse de la sortie Git via des commandes de manipulation de texte ou des langages de script, qui peuvent ne pas être présents sur tous les systèmes. En plus de cela, la plupart des suggestions utilisent des commandes porcelaine, dont la sortie n'est pas conçue pour être analysée par script ("porcelaine" se réfère aux commandes destinées à une opération humaine; les scripts doivent utiliser les commandes "plomberie" de niveau inférieur).
Lectures complémentaires:
Si vous voulez le faire en toute sécurité, pour le cas d'utilisation de la question (branches de suivi de récupération de place qui ont été supprimées sur le serveur mais existent toujours en tant que branches locales) et avec des commandes Git de haut niveau uniquement, vous devez
git fetch --prune
(ou git fetch -p
, qui est un alias, ou git prune remote origin
qui fait la même chose sans aller chercher, et n'est probablement pas ce que vous voulez la plupart du temps).
- Notez toutes les branches distantes signalées comme supprimées. Ou, pour les retrouver plus tard,
git branch -v
(toute branche de suivi orpheline sera marquée "[disparu]").
git branch -d [branch_name]
sur chaque branche de suivi orpheline
(ce que proposent certaines des autres réponses).
Si vous voulez for-each-ref
créer un script pour une solution, alors est votre point de départ, comme dans la réponse de Mark Longair ici et cette réponse à une autre question , mais je ne vois pas de moyen de l'exploiter sans écrire une boucle de script shell, ou en utilisant xargs ou quelque chose .
Explication du contexte
Pour comprendre ce qui se passe, vous devez comprendre que, dans le cas du suivi des succursales, vous n'avez pas une succursale, mais trois. (Et rappelez-vous que "branche" signifie simplement un pointeur vers une validation.)
Étant donné une branche de suivi feature/X
, le référentiel distant (serveur) aura cette branche et l'appellera feature/X
. Votre référentiel local a une branche remotes/origin/feature/X
qui signifie: «Voici ce que la télécommande m'a dit que sa branche fonctionnalité / X était, la dernière fois que nous avons parlé», et enfin, le référentiel local a une branche feature/X
qui pointe vers votre dernier commit et est configuré pour "Piste"remotes/origin/feature/X
, ce qui signifie que vous pouvez tirer et pousser pour les maintenir alignés.
À un moment donné, quelqu'un a supprimé le feature/X
sur la télécommande. A partir de ce moment, vous vous retrouvez avec votre local feature/X
(dont vous ne voulez probablement plus, car le travail sur la fonctionnalité X est probablement terminé), et le vôtre remotes/origin/feature/X
est certainement inutile car son seul but était de se souvenir de l'état de la branche du serveur .
Et Git vous permettra de nettoyer automatiquement les redondants remotes/origin/feature/X
- c'est ce qui se git fetch --prune
passe - mais pour une raison quelconque, il ne vous permet pas de supprimer automatiquement les vôtres feature/X
... même si votre feature/X
contient toujours les informations de suivi orphelines, il contient donc les informations pour identifier les anciennes succursales de suivi qui ont été complètement fusionnées. (Après tout, il peut vous donner les informations qui vous permettent de faire l'opération vous-même à la main.)
* master
sur mon système. La commande suivante a fonctionné pour moi:git branch -d $(git branch --merged |tail -n +2)