Normalement, je ne répondrais pas à 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 est la suivante : "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, sans être fragile, sans être 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 : toutes reposent sur l'analyse de la sortie de Git par des commandes de manipulation de texte ou des langages de script, qui ne sont pas nécessairement présents sur tous les systèmes. En plus de cela, la plupart des suggestions utilisent des commandes de 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 ; script devraient utiliser les commandes de "plomberie" de niveau inférieur).
Pour en savoir plus :
Si vous voulez faire cela en toute sécurité, pour le cas d'utilisation de la question (garbage-collect tracking des branches qui ont été supprimées sur le serveur mais qui 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 récupérer les données, et qui n'est probablement pas ce que vous voulez la plupart du temps).
- Notez toutes les branches distantes qui sont signalées comme supprimées. Ou, pour les retrouver plus tard,
git branch -v
(toute branche de suivi orpheline sera marquée "[gone]").
-
git branch -d [branch_name]
sur chaque branche de suivi orpheline
(c'est ce que proposent certaines des autres réponses).
Si vous voulez script une solution, alors for-each-ref
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 comment l'exploiter sans écrire une boucle shell script, ou utiliser xargs ou autre.
Explication du contexte
Pour comprendre ce qui se passe, vous devez comprendre que, dans la situation de suivi des branches, vous n'avez pas une branche, mais trois. (Et rappelez-vous que "branche" signifie simplement un pointeur vers un commit).
Étant donné une branche de suivi feature/X
le référentiel distant (serveur) aura cette branche et l'appellera feature/X
. Votre dépôt local possède une branche remotes/origin/feature/X
ce qui signifie, "C'est ce que le dépôt distant m'a dit que sa branche feature/X était, la dernière fois que nous avons parlé," et enfin, le dépôt local a une branche feature/X
qui pointe vers votre dernier commit, et est configuré pour "suivre" remotes/origin/feature/X
Ce qui signifie que vous pouvez tirer et pousser pour les maintenir alignés.
A 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
(que vous ne voulez probablement plus, puisque le travail sur la fonctionnalité X est vraisemblablement terminé), et vos remotes/origin/feature/X
qui 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 redondances. remotes/origin/feature/X
-- c'est ce que git fetch --prune
mais pour une raison inconnue, il ne vous permet pas de supprimer automatiquement vos propres feature/X
... même si votre feature/X
contient toujours les informations de suivi orphelines, il dispose donc des informations nécessaires pour identifier les anciennes branches de suivi qui ont été entièrement fusionnées. (Après tout, il peut donner vous les informations qui vous permettent d'effectuer vous-même l'opération à la main).
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.