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


770

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

Mais je veux également 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?



1
One-liner, cross platform, ne ressemble pas au chat dormant sur votre clavier: npx git-removed-branches(course à sec) ou npx git-removed-branches --prune(pour de vrai). Vous devez déjà avoir node.js installé. Voir les réponses ci-dessous pour plus de détails.
Cristian Diaconescu

Réponses:


892

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 figurent pas dans la liste des télécommandes.

Cette ligne devrait faire l'affaire (nécessite bashou zshne 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 obtient la liste des branches distantes et la transmet egrepvia l'entrée standard. Et filtre les branches qui ont une branche de suivi à distance (en utilisant git branch -vvet filtrant pour celles qui en ont origin) puis en obtenant la première colonne de cette sortie qui sera le nom de la branche. Enfin, en passant tous les noms de branche dans la commande delete branch.

Puisqu'il utilise l' -doption, il ne supprimera 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 d' git fetch --prune abord exécuter , sinon vous git branch -rverrez toujours les branches distantes.


12
Cela a parfaitement fonctionné pour moi. D'une certaine manière, git fetch -pn'est-ce pas toujours suffisant?
Stefan Hendriks

16
Malheureusement, cela ne fonctionne pas dans Git Bash sur Windows. sh.exe": cannot make pipe for process substitution: Function not implemented sh.exe": egrep -v -f /dev/fd/0: No such file or directory fatal: branch name required Des idées?
Ludder

37
Pour l'ajouter comme alias:alias git-remove-untracked='git fetch --prune && git branch -r | awk "{print \$1}" | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk "{print \$1}" | xargs git branch -d'
bryant1410

126
Y a-t-il une commande proposée pour une future version de git qui fera cela? Cette commande ressemble à celle de mon chat sur mon ordinateur portable
Bron Davies

5
l'utilisation git branch -Dà la fin de la commande a mieux fonctionné pour nous, car nous avons tendance à écraser les commits sur la fusion, ce qui nous The branch x is not fully mergedgénère des erreurs lors de l'exécution avec -d.
Mateus Gondim

430

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'infos .


4
A parfaitement fonctionné, je pense! Quelqu'un pourrait-il expliquer si cette réponse fait quelque chose de différent de la réponse acceptée?
Andrew

11
Amélioration mineure: utilisez xargs -r git branch -dpour que rien ne soit exécuté s'il n'y a pas de branches à supprimer. Notez que le -rdrapeau n'est peut-être pas disponible partout
Jacob Wang

8
Puisque grep peut ne pas correspondre en raison des couleurs git:git branch --merged master --no-color | grep -v '^* master$' | xargs -n1 -r git branch -d
Mike D

5
@NickRes voyant comme vous l'avez demandé si gentiment, git branch --merged masterrépertorie les branches qui sont fusionnées en master, puis la partie grep du milieu exclut master lui-même (nous ne voulons pas supprimer master!), Et la dernière partie xargs s'exécute git branch -d(delete branch) sur chacun des Les resultats. Ou vous pouvez simplement lire le lien Plus d'infos fourni dans la réponse;)
jackocnr

14
Amélioration: git branch --merged master | egrep -v '^\s*\*?\s*master$' | xargs git branch -d. La sortie de git v2.10.1 affichera "* master" lorsque master est extrait. Je me débarrasse du maître avec ou sans astérisque.
Esteban

162

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

 -p, --prune
        After fetching, remove any remote-tracking branches which no longer exist on the remote.

Alors, peut-être, git fetch -pc'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 les raisons pour lesquelles j'ai présenté cette réponse ...

Premièrement, le PO dit vouloir "supprimer également les succursales locales créées à partir de ces succursales distantes [qui ne sont plus sur la télécommande]". Ce n'est pas sans ambiguïté possible 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 Aet B. Si je clone ce dépôt sur mon système local, mon clone aura des références locales (pas encore des branches réelles) appelées origin/Aet 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 référentiel local qui a un nom différent de son origine, et j'ai également une branche locale qui n'existe pas (encore) sur le référentiel d'origine.

Maintenant , disons que je supprimer à la fois les Aet les Bbranches sur la prise en pension à distance et mettre à jour mon repo local ( git fetchd' une certaine forme), ce qui provoque mes refs locales origin/Aet origin/Bà disparaître. Maintenant, mon a repo locale trois branches encore, A, Z, et C. Aucun d'entre eux n'a de branche correspondante sur le référentiel 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à l'origine, je n'ai aucun moyen de savoir qu'elle a Zété créée à partir deB, car il a été renommé dans le processus, probablement pour une bonne raison. Donc, vraiment, sans un 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 à supprimer. Sans certaines informations externes qui gitne sont pas automatiquement conservées pour vous, git fetch -psont à peu près aussi proches que possible, 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 aurait autrement veulent supprimer.

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


108
Cela ne supprime pas les branches locales, seulement les pointeurs distants vers les branches
Jaap

4
Il supprime uniquement ces branches locales, qui n'existent pas dans la télécommande ET vous n'avez jamais effectué de paiement sur elles.
Jarek Jakubowski

15
Vous devriez lire la question plus attentivement comme le note Jaap. Les personnes qui votent pour cette réponse devraient également lire de quoi il s'agit vraiment.
Søren Boisen

4
Oui, c'était exactement ce que je voulais faire! @ SørenBoisen J'espère qu'au cours des deux dernières années, vous avez eu le temps de revoir votre opinion ... Si le contenu publié sur SO devait toujours être uniquement lié à ce que les PO parfois vraiment confus demandent, nous supprimerions beaucoup d'informations. S'il vous plaît ne présumez pas d'instruire les gens comment ils peuvent utiliser ce site, autre que les directives officielles, et ils n'empêchent clairement pas les réponses orthogonales mais utiles.
Félix Gagnon-Grenier

6
@ FélixGagnon-Grenier Voici mon problème avec cette réponse: 1) La question est limpide, OP n'est clairement pas confondu. 2) Cette réponse ne mentionne pas qu'elle ne répond pas à la question! 3) La question indique déjà un moyen d'élaguer les branches de suivi à distance qui n'existent plus, donc elle n'ajoute aucune valeur.
Søren Boisen

117

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

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

Détails:

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

    mybranch abc1234 [origin/mybranch: gone] commit comments
    
  • -dvérifiera s'il a été fusionné ( -Dle supprimera malgré tout)

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

16
Vous pouvez même raccourcir la commande avecgit branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
chiborg

4
Juste en soulignant que vous devriez être maître avant de faire cela, car git branch -dcompare les branches avec HEAD.
Steve Bennett

Excellent! J'ai regardé et cherché cela. J'aimerais avoir vu votre réponse avant de finir par la découvrir par moi-même. Cela m'aurait fait gagner quelques minutes. Voici mon autre réponse: stackoverflow.com/questions/15661853/…
Karl Wilbur

1
Je me suis retrouvé avec un alias git similaire, utilisé cut car awk ne fonctionnait pas pour une raison quelconque:prunelocal = !sh -c \"git checkout -q master && git fetch -q --prune && git branch -vv | git grep ': gone]' | cut -d' ' -f3 | xargs git branch -d\"
Zitrax

3
Oh mec ... wisbucky tu as besoin de mettre à jour ta réponse pour dire aux gens qu'ils devraient être maîtres. Je viens de le faire à partir d'une branche différente. @ stevebennet2 merci pour le commentaire informatif
GrayedFox

53

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

Lors de l'appel git fetchou git pullaprès, les références aux branches distantes supprimées sont supprimées automatiquement.


5
cela ne supprime pas les branches locales, juste des références à elles, non?
Clint Eastwood

@ClintEastwood Il supprime uniquement les références aux branches distantes . Vous pouvez répertorier les références aux branches distantes à l'aide de git branch -r.
Wedesoft

52

Il existe un package NPM soigné qui le fait pour vous (et il devrait fonctionner sur plusieurs plates-formes).

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

Et puis git removed-branchesvous montrera toutes les branches locales périmées et les git removed-branches --prunesupprimera.

Plus d'infos ici.


1
Cela devrait vraiment avoir plus de votes positifs. Merci d'avoir rendu la vie facile, quelle que soit la plateforme.
Cryptage

Petite extension pratique. Installé et fonctionnant correctement sur Windows 10. Petite remarque: il considère les branches non fusionnées comme prune-able (erreur lors de l'exécution de --prune, même si la branche -d a été appelée) .. elles ne sont cependant pas désignées comme telles dans l'initiale liste montrée.
user2864740

1
Ceci est ma réponse préférée. npx git-removed-branchesfonctionne comme un rêve.
Drazisil

Oui! Cela devrait avoir plus de votes positifs! solution si simple et intuitive pour le débutant de cli
geoseong

Il serait utile de donner un aperçu de ce que l'outil fait du point de vue de git.
ryanwebjackson

41

Solution Windows

Pour Microsoft Windows Powershell:

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

Explication

git checkout master passe à la branche principale

git remote update origin --prune élagage des branches éloignées

git branch -vvobtient une sortie détaillée de toutes les branches ( référence git )

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

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

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


Bel exemple. sinon git remote prune origin, select-string ne semble pas correspondre à la dernière version de git. Pensez à utiliserConvertFrom-String -TemplateContent
Bernie White

3
Il semble que la dernière version de git ajoute des espaces de fin, donc le Split ne fonctionne pas pour obtenir le nom de la branche. Faites .toString (). Trim (). Split ("") et ce sera
Chris Hynes

Voici le mien:git checkout master; git pull; git remote prune origin; git branch --merged | select-string -notmatch "master" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}
Omzig

@Omzig Qu'est-ce que cela fait différemment? Pouvez-vous donner une explication>
chris31389

@ chris31389, j'ai la possibilité de récupérer tout ce qui me manque dans master, et j'ai changé la branche en --merged et non master, je veux m'assurer de ne supprimer que les branches --merged. Ça me fait me sentir mieux;)
Omzig

27

Il répertorie 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 souhaitez déréférencer ces branches locales de locales qui ne sont pas suivies

$ git remote prune origin

19
Cela ne répond pas à la question, c'est ce que le PO savait déjà.
Ken Williams

2
Je suis également d'accord, mais lorsque vous recherchez "Comment tailler les branches de suivi locales qui n'existent plus sur la télécommande", c'est le lien supérieur et cette réponse correspond au titre (pas si l'on a lu la description complète en question), que est la raison des votes positifs :)
027

Cela ne supprime pas les branches locales. Toujours là après avoir exécuté cela
Xin

@Xin essayez d'exécuter la commande sans l'argument --dry-run car il n'exécutera pas réellement la commande, mais vous montrera ce qu'elle changera.
Torsten Ojaperv

19

Comme le note @tzacks ... il existe un package npm qui est pratique pour cela. Faites juste:

npx git-removed-branches --prune

(J'aurais commenté mais pas assez de réputation)


1
Magnifique. Pas de soucis du tout. Heureux que c'était une réponse complète!
Dan Rayson

1
Cela devrait être au sommet. Fonctionne également sous Windows.
tomtastico

14

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

  • Répertorie la branche actuelle et les branches qui y ont été fusionnées
  • Filtre la branche actuelle
  • Nettoie tous les espaces de début ou de fin de la gitsortie pour chaque nom de branche restant
  • Supprime les succursales locales fusionnées

Cela vaut la peine de s'exécuter git branch --mergedtout d'abord pour vous assurer qu'il ne supprimera que ce que vous attendez.

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


10

Une doublure encore plus courte et plus sûre:

git branch -d $(git branch --merged | cut -c 3- | grep -v master)

Assurez-vous de passer à la succursale qui n'est pas encore fusionnée, avant de l'exécuter. Parce que vous ne pouvez pas supprimer la branche sur laquelle vous êtes actuellement enregistré.


3
cela supprimera-t-il également votre «maître»?
dcsan

2
Si vous êtes actuellement inscrit en master, alors non, sinon oui
FelikZ

1
Pour sauter le master, vous pouvez simplement diriger vers grep et sélectionner l'inverse, comme ça - git branch -d $(git branch --merged | cut -c 3- | grep -v master)
mozillalives

C'est dangereux et quelqu'un à l'avenir supprimera sans le savoir sa branche principale
jasonseminara

1
@jasonseminara #dcsan J'ai mis à jour l'extrait, il saute donc la branche principale. #mozillalives thanks
FelikZ

9

Je voulais quelque chose qui purgerait toutes les branches locales qui suivaient une branche distante, sur origin, où la branche distante a été supprimée ( gone). Je ne voulais pas supprimer les branches locales qui n'avaient jamais été configurées pour suivre une branche distante (c'est-à-dire mes branches de développement locales). En outre, je voulais un simple one-liner qui utilise simplement git, ou d'autres outils CLI simples, plutôt que d'écrire des scripts personnalisés. J'ai fini par utiliser un peu de grepet awkpour faire cette commande simple, puis je l'ai ajoutée comme alias dans mon ~/.gitconfig.

[alias]
  prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -D

Voici une git config --global ...commande pour ajouter facilement ceci comme git prune-branches:

git config --global alias.prune-branches '!git remote prune origin && git branch -vv | grep '"'"': gone]'"'"' | awk '"'"'{print $1}'"'"' | xargs -r git branch -d'

REMARQUE: L'utilisation du -Ddrapeau git branchpeut être très dangereuse. Donc, dans la commande config ci-dessus, j'utilise l' -doption git branchplutôt que -D; J'utilise -Ddans ma config actuelle. J'utilise -Dparce que je ne veux pas entendre Git se plaindre des succursales non fusionnées, je veux juste qu'elles s'en aillent. Vous pouvez également souhaiter cette fonctionnalité. Si c'est le cas, utilisez simplement -Dplutôt -dqu'à la fin de cette commande de configuration.


8

Pour supprimer des branches distantes:

$git remote prune origin

Pour supprimer des branches locales déjà fusionnées:

$git branch -D $(git branch --merged)

Travaille pour moi. Merci.
AndroidRuntimeException

2
(git branch --merged) renvoie également 'master' pour moi. Et d'autres branches qui n'ont pas été supprimées de la télécommande.
Tom G

8
Cela a supprimé ma branche principale.
Greg

@Greg Juste localement, cependant, non?
GC_

5

Il ne semble pas y avoir de one-liner sûr, trop de cas de bord (comme une branche ayant "master" dans son nom, etc.). La plus sûre est ces étapes:

  1. git branch -vv | grep 'gone]' > stale_branches.txt
  2. afficher le fichier et supprimer les lignes des branches que vous souhaitez conserver (comme la branche principale!); vous n'avez pas besoin de modifier le contenu d'une ligne
  3. awk '{print $1}' stale_branches.txt | xargs git branch -d

5

Sur la base des réponses ci-dessus, j'utilise cette doublure plus courte:

git remote prune origin | awk 'BEGIN{FS="origin/"};/pruned/{print $2}' | xargs -r git branch -d

De plus, si vous avez déjà taillé et avez des branches pendantes locales, cela les nettoiera:

git branch -vv | awk '/^ .*gone/{print $1}' | xargs -r git branch -d

1
Ne fonctionne pas si vos noms de branche ont /en eux
theicfire

4

Je ne sais pas comment faire tout cela 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 succursale locale quel que soit son statut fusionné.


Sous Windows, les autres réponses ne fonctionnaient pas pour moi. L'utilisation de cette réponse avec le simple commutateur -D l'a fait (même si la branche avait déjà été "supprimée").

Pouvons-nous le faire pour toutes les succursales à la fois?
Teoman shipahi

3

Vous pouvez utiliser cette commande:

git branch --merged master | grep -v "\* master" | xargs -n 1 git branch -d

Git Clean: supprimer les branches déjà fusionnées, y compris la rupture de commande


Vous n'avez pas vraiment besoin de filtrer les branches (ex master). S'il est "fusionné", cela signifie simplement qu'il supprimera votre copie locale, mais "git checkout dev" créera une branche locale à distance s'il n'est pas déjà présent
csga5000

Mais la liste des succursales locales est toujours là même si elles sont fusionnées. Cette commande consiste à supprimer ces branches qui ont été supprimées de la télécommande.
sendon1982

un astérisque au début signifie la branche actuelle, lorsque vous exécutez cette commande sur une branche différente ne fonctionnera pas bien
OzzyCzech

2

Sur la base des réponses ci-dessus, je suis venu avec cette solution à une ligne:

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

2

En utilisant une variante de la réponse de @ wisbucky, j'ai ajouté ce qui suit comme alias à mon ~/.gitconfigfichier:

pruneitgood = "!f() { \
    git remote prune origin; \
    git branch -vv | perl -nae 'system(qw(git branch -d), $F[0]) if $F[3] eq q{gone]}'; \
}; f"

Avec cela, un simple git pruneitgoodnettoiera les branches locales et distantes qui ne sont plus nécessaires après les fusions.


2

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

git branch --merged master | %{ if($_ -notmatch '\*.*master'){ git branch -d "$($_.Trim())" }}

Cela supprimera toutes les branches locales qui ont été fusionnées dans master, pendant que vous êtes sur la branche master .

git checkout master commuter.


1

La variante de Schleis ne fonctionne pas pour moi (Ubuntu 12.04), alors laissez-moi vous proposer mes variantes (claires et brillantes :):

Variante 1 (je préférerais cette option):

git for-each-ref --format='%(refname:short) %(upstream)' refs/heads/ | awk '$2 !~/^refs\/remotes/' | xargs git branch -D 

Variante 2:

une. Essai à sec:

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | awk '{print "git branch -D " $1}'

b. Supprimer les branches:

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | xargs git branch -D

1

Voici une adaptation de la réponse de @ wisbucky pour les utilisateurs de Windows:

for /f "tokens=1" %i in ('git branch -vv ^| findstr ": gone]"') DO git branch %i -d

J'utilise posh-git et malheureusement PS n'aime pas le nu for, j'ai donc créé un script de commande plain 'ol nommé PruneOrphanBranches.cmd:

@ECHO OFF
for /f "tokens=1" %%i in ('git branch -vv ^| findstr ": gone]"') DO CALL :ProcessBranch %%i %1

GOTO :EOF

:ProcessBranch
IF /I "%2%"=="-d" (
    git branch %1 %2
) ELSE (
    CALL :OutputMessage %1
)
GOTO :EOF

:OutputMessage
ECHO Will delete branch [%1] 
GOTO :EOF

:EOF

Appelez-le sans paramètres pour afficher une liste, puis appelez-le avec "-d" pour effectuer la suppression réelle ou "-D" pour toutes les branches qui ne sont pas complètement fusionnées mais que vous souhaitez supprimer de toute façon.


Cela n'a pas fonctionné pour moi, en quelque sorte le :ou : (avec un espace) l'a findstrfait correspondre à tout à chaque fois - j'ai presque supprimé master. Cependant, l'utilisation d'une expression régulière a bien fonctionné:git branch -vv ^| findstr /R " \[origin/[0-9]+: gone\] "
Josh

1

Essayez ceci dans git bash, pour récupérer et tailler les références aux branches supprimées, puis tailler les branches locales qui suivaient les branches supprimées:

git fetch -p && git branch -d `git branch -vv | grep ': gone]' | awk '{print $1}' | xargs`

N'oubliez pas de retirer d'abord une branche qui ne sera pas supprimée, afin que cela ne bloque pas la suppression de la branche.


0

J'ai transformé la réponse acceptée en un script robuste. Vous le trouverez dans mon dépôt git-extensions .

$ git-prune --help
Remove old local branches that do not exist in <remote> any more.
With --test, only print which local branches would be deleted.
Usage: git-prune [-t|--test|-f|--force] <remote>

0

J'ai atteint cette page en cherchant la réponse pour "comment supprimer les succursales extraites localement qui n'ont plus de succursale en amont"

Je ne me souciais pas non plus de savoir si la succursale locale avait été fusionnée ou non, car le raccordement à git branch -dwill simplement avertir au lieu de supprimer les succursales locales non fusionnées.

git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3 | egrep -v -f /dev/fd/0 <(git branch -a | grep -v origin) | grep branch_prefix_that_I_care_about | xargs git branch -d

# translation
# git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3
## this finds all remote branch names minus the "remote/origin/" part
#
# <(git branch -a | grep -v origin)
## this finds all local branch names and redirects it into the previous command
#
# egrep -v -f /dev/fd/0 STUFF
## this is doing some weird magic that I'm grokking as "take the set difference from whatever was piped in"
#
#
# overall translation: (STUFF TO CONSIDER) | egrep magic <(STUFF TO REMOVE FROM CONSIDERATION) | do cool things with resulting stuff


0

Voici ma solution:

git fetch -p
git branch -vv | grep ": gone" | awk '{print $1}' | xargs git branch -d
  • -p consiste à supprimer toutes les références de suivi à distance qui n'existent plus sur la télécommande. La première étape supprimera donc les références aux branches distantes.

  • -vv permet d'afficher sha1 et de valider la ligne d'objet pour chaque tête, ainsi que la relation avec la branche amont (le cas échéant). La deuxième étape obtiendra toutes les branches locales et la commande grep filtrera les branches qui ont été supprimées.


Encore plus petit (comme décrit dans un autre commentaire)git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
mrroboaat

-2

Supprimer toute branche qui n'est pas à jour avec le maître

git co master && git branch | sed s/\*/\ / | xargs git branch -d 2> /dev/null

-3

Je suis sûr que git remote prune originc'est ce que vous voulez.

Vous pouvez l'exécuter git remote prune origin --dry-runpour voir ce qu'il ferait sans apporter de modifications.


12
Cela ne supprime pas réellement la branche locale elle-même.
Taytay

-16

Vous utilisez l'interface graphique? Procédure manuelle, mais rapide et facile.

$ git gui

Sélectionnez "Branche -> Supprimer". Vous pouvez sélectionner plusieurs branches avec ctrl-clic (fenêtres) et les supprimer toutes.


C'est drôle à quel point cette réponse est négative. Approche totalement valide IMO si vous aimez l'interface graphique.
serraosays
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.