Question Comment élaguer les branches de suivi locales qui n'existent plus sur la télécommande


Avec git remote prune origin Je peux supprimer les branches locales qui ne sont plus sur la télécommande.

Mais je veux aussi supprimer les branches locales qui ont été créées à partir de ces branches distantes (une vérification si elles ne sont pas fusionnées serait bien).

Comment puis-je faire ceci?


424
2017-10-25 08:31


origine


Réponses:


Après l'élagage, vous pouvez obtenir la liste des branches distantes avec git branch -r. La liste des branches avec leur branche de suivi à distance peut être récupérée avec git branch -vv. Donc, en utilisant ces deux listes, vous pouvez trouver les branches de suivi à distance qui ne sont pas dans la liste des télécommandes.

Cette ligne devrait faire l'affaire (nécessite bash ou zsh, ne fonctionnera pas avec le shell Bourne standard):

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

Cette chaîne récupère la liste des branches distantes et la transmet à egrep à travers l'entrée standard. Et filtre les branches qui ont une branche de suivi à distance (en utilisant git branch -vv et le filtrage pour ceux qui ont origin) puis obtenir la première colonne de cette sortie qui sera le nom de la branche. Enfin, passez tous les noms de branche dans la commande delete branch.

Comme il utilise le -d option, il ne supprime pas les branches qui n'ont pas été fusionnées dans la branche sur laquelle vous vous trouvez lorsque vous exécutez cette commande.

Souvenez-vous également que vous devrez exécuter git fetch --prune  premier, autrement git branch -r verra toujours les branches distantes.


525
2018-06-10 17:54



Si vous souhaitez supprimer toutes les branches locales déjà fusionnées dans master, vous pouvez utiliser la commande suivante:

git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d

Plus d'informations.


273
2018-06-03 22:17



Au milieu des informations présentées par git help fetch, il y a ce petit objet:

 -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 cherchez?

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, l'OP dit vouloir "supprimer également les branches locales créées à partir de ces branches distantes [qui ne sont plus sur la télécommande]". Cela n'est pas sans ambiguïté possible git. Voici un exemple.

Disons que j'ai un repo sur un serveur central, et il a deux branches, appelées A et B. Si je clone ce repo à mon système local, mon clone aura des refs locaux (pas encore des branches réelles) appelés origin/A et origin/B. Maintenant, disons que je fais 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.

Maintenant, disons que je retire les deux A et B branches sur le repo distant et mettre à jour mon repo local (git fetch de quelque forme), ce qui provoque mes refs locales origin/A et origin/B disparaître. Maintenant, mon repo local a encore trois branches, A, Z, et C. Aucun d'entre eux n'a de branche correspondante sur le repo distant. Deux d'entre eux ont été "créés à 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 savoir que Za été créé à partir de B, car il a été renommé dans le processus, probablement pour une bonne raison. Donc, vraiment, sans quelque processus externe d'enregistrement des métadonnées d'origine de la branche, ou un humain qui connaît l'histoire, il est impossible de dire laquelle des trois branches, le cas échéant, l'OP vise le retrait. Sans certaines informations externes git ne maintient pas automatiquement pour vous, git fetch -p est à peu près aussi proche que vous pouvez obtenir, et toute méthode automatique pour tenter littéralement ce que l'OP a demandé risque de supprimer trop de branches, ou de manquer certaines que l'OP voudrait autrement supprimer.

Il y a d'autres scénarios, par exemple, si je crée trois branches séparées origin/A pour tester trois approches différentes de quelque chose, puis origin/A s'en va. Maintenant, j'ai trois branches, qui ne peuvent évidemment pas toutes correspondre au nom, mais elles ont été créées à partir de origin/A, donc une interprétation littérale de la question des PO nécessiterait la suppression des trois. Cependant, cela peut ne pas être souhaitable, si vous pouviez même trouver un moyen fiable de les faire correspondre ...


98
2018-06-10 17:31



Cela supprimera les branches locales pour lesquelles les branches de suivi à distance ont été élaguées. (Assurez-vous que vous êtes sur master branche!)

git checkout master
git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -d

Détails:

  • git branch -vv affiche "allé" pour les branches locales que la télécommande a été élaguée.

    mybranch abc1234 [origin/mybranch: gone] commit comments
    
  • -d vérifiera s'il a été fusionné (-D va le supprimer indépendamment)

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

80
2018-05-27 22:35



On peut configurer Git pour supprimer automatiquement les références aux branches distantes supprimées lors de la récupération:

git config --global fetch.prune true

En appelant git fetch ou git pull ensuite, les références aux branches distantes supprimées sont supprimées automatiquement.


35
2018-01-12 11:09



Il y a un bon paquet de NPM qui le fait pour vous (et il devrait fonctionner sur plusieurs plateformes).

Installez-le avec: npm install -g git-removed-branches

Et alors git removed-branches vous montrera toutes les branches locales viciées, et git removed-branches --prune pour les supprimer réellement.

Plus d'infos ici.


15
2017-08-15 18:41



Il liste les branches locales dont la branche de suivi à distance est supprimée de la télécommande

$ git remote prune origin --dry-run

Si vous voulez dé-référencer ces branches locales de local qui ne sont pas suivies

$ git remote prune origin

14
2017-12-09 05:28



Si vous utilisez Windows et Powershell, vous pouvez utiliser ce qui suit pour supprimer toutes les branches locales qui ont été fusionnées dans la branche actuellement extraite:

git branch --merged | ? {$_[0] -ne '*'} | % {$_.trim()} | % {git branch -d $_}

Explication

  • Liste la branche actuelle et les branches qui y ont été fusionnées
  • Filtre la branche en cours
  • Nettoie tous les espaces de début ou de fin du git sortie pour chaque nom de succursale restant
  • Supprime les branches locales fusionnées

Ça vaut la peine de courir git branch --merged par lui-même d'abord juste pour s'assurer que cela va seulement supprimer ce que vous attendez.

(Porté / automatisé de http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/.)


9
2018-04-10 22:57



Solution Windows

Pour Microsoft Windows Powershell:

git checkout master; git remote update origin --prune; git branch -vv | Select-String -Pattern ": gone]" | % { $_.toString().Split(" ")[0]} | % {git branch -d $_}

Explication

git checkout master passe à la branche principale

git remote update origin --prune branches distantes de pruneaux

git branch -vv obtient une sortie verbeuse de toutes les branches (référence git)

Select-String -Pattern ": gone]" obtient seulement les enregistrements où ils ont été retirés de la télécommande.

% { $_.toString().Split(" ")[0]} obtenir le nom de la succursale

% {git branch -d $_} supprime la branche


5
2018-03-01 09:59



Je ne sais pas comment tout faire en même temps, mais git git branch -d <branchname> supprimera une branche locale UNIQUEMENT si elle est complètement fusionnée. Notez le d minuscule.

git branch -D <branchname> (notez le D majuscule) supprimera une branche locale quel que soit son statut fusionné.


4
2017-10-25 08:35