Parmi les informations présentées par git help fetch
, il y a ce petit élément :
-p, --prune
After fetching, remove any remote-tracking branches which no longer exist on the remote.
Alors, peut-être, git fetch -p
est ce que vous recherchez ?
EDIT : Ok, pour ceux qui débattent encore de cette réponse 3 ans après les faits, voici un peu plus d'informations sur la raison pour laquelle j'ai présenté cette réponse...
Tout d'abord, le PO indique qu'il souhaite "supprimer également les branches locales qui ont été créées à partir de ces branches distantes [qui ne sont plus sur la branche distante]". Cela n'est pas possible sans ambiguïté en git
. Voici un exemple.
Disons que j'ai un dépôt sur un serveur central, et qu'il a deux branches, appelées A
y B
. Si je clone ce repo sur mon système local, mon clone aura des refs locales (pas encore de branches réelles) appelées origin/A
y origin/B
. Supposons maintenant que je fasse ce qui suit :
git checkout -b A origin/A
git checkout -b Z origin/B
git checkout -b C <some hash>
Les faits pertinents ici sont que, pour une raison quelconque, j'ai choisi de créer une branche sur mon repo local qui a un nom différent de son origine, et j'ai également une branche locale qui n'existe pas (encore) sur le repo d'origine.
Supposons maintenant que je supprime les deux A
y B
sur le repo distant et mettre à jour mon repo local ( git fetch
d'une forme ou d'une autre), ce qui fait que mes refs locaux origin/A
y origin/B
à disparaître. Maintenant, mon repo local a encore trois branches, A
, Z
y C
. Aucune d'entre elles n'a de branche correspondante sur le repo distant. Deux d'entre elles ont été "créées à partir de ... branches distantes", mais même si je sais qu'il y avait une branche appelée B
sur l'origine, je n'ai aucun moyen de le savoir. Z
a été créé à partir de B
Il a été renommé au cours du processus, probablement pour une bonne raison. En réalité, sans un processus externe enregistrant les métadonnées relatives à l'origine des branches, ou sans une personne connaissant l'histoire, il est impossible de dire laquelle des trois branches, le cas échéant, le PO vise pour la suppression. En l'absence d'informations externes qui git
n'est pas automatiquement maintenue pour vous, git fetch -p
est à peu près aussi proche que possible, et toute méthode automatique pour tenter littéralement ce que le PO a demandé court le risque de supprimer trop de branches, ou d'en manquer certaines que le PO aurait voulu supprimer.
Il existe également d'autres scénarios, par exemple si je crée trois branches distinctes de origin/A
tester trois approches différentes de quelque chose, et ensuite origin/A
disparaît. J'ai maintenant trois branches, qui ne peuvent évidemment pas toutes correspondre en termes de nom, mais qui ont été créées à partir de origin/A
Il s'agit donc d'une interprétation littérale de la question du PO qui nécessiterait la suppression de ces trois éléments. Toutefois, cela n'est peut-être pas souhaitable, si l'on peut même trouver un moyen fiable de les faire correspondre...
11 votes
Duplicata possible de Supprimer les branches locales qui ne sont plus sur le site distant
5 votes
One-liner, multiplateforme, ne donne pas l'impression que le chat a dormi sur votre clavier :
npx git-removed-branches
(marche à blanc) ounpx git-removed-branches --prune
(pour de vrai). Vous devez déjà avoir node.js installés. Voir aussi réponses ci-dessous pour plus de détails.0 votes
Je pense généralement que ces choses doivent être faites délibérément et non pas automatiquement, sinon vous risquez de supprimer quelque chose que vous ne vouliez pas supprimer. Je m'en tiendrais donc à git branch -d localBranchName et git push origin --delete remoteBranchName.
3 votes
Pour les utilisateurs d'IntelliJ, le plugin suivant fait exactement ce dont vous avez besoin : plugins.jetbrains.com/plugin/10059-git-branch-cleaner