Avec git remote prune origin
je 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?
npx git-removed-branches
(course à sec) ounpx 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.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 avecgit 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
bash
ouzsh
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 obtient la liste des branches distantes et la transmet
egrep
via l'entrée standard. Et filtre les branches qui ont une branche de suivi à distance (en utilisantgit branch -vv
et filtrant pour celles qui en ontorigin
) 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'
-d
option, 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 vousgit branch -r
verrez toujours les branches distantes.la source
git fetch -p
n'est-ce pas toujours suffisant?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?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'
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 nousThe branch x is not fully merged
génère des erreurs lors de l'exécution avec-d
.Si vous souhaitez supprimer toutes les branches locales déjà fusionnées dans master, vous pouvez utiliser la commande suivante:
Plus d'infos .
la source
xargs -r git branch -d
pour que rien ne soit exécuté s'il n'y a pas de branches à supprimer. Notez que le-r
drapeau n'est peut-être pas disponible partoutgit branch --merged master --no-color | grep -v '^* master$' | xargs -n1 -r git branch -d
git branch --merged master
ré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écutegit branch -d
(delete branch) sur chacun des Les resultats. Ou vous pouvez simplement lire le lien Plus d'infos fourni dans la réponse;)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.Au milieu des informations présentées par
git help fetch
, il y a ce petit article:Alors, peut-être,
git fetch -p
c'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
A
etB
. 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éesorigin/A
etorigin/B
. Maintenant, disons que je fais ce qui suit: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
A
et lesB
branches sur la prise en pension à distance et mettre à jour mon repo local (git fetch
d' une certaine forme), ce qui provoque mes refs localesorigin/A
etorigin/B
à disparaître. Maintenant, mon a repo locale trois branches encore,A
,Z
, etC
. 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éeB
à l'origine, je n'ai aucun moyen de savoir qu'elle aZ
é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 quigit
ne sont pas automatiquement conservées pour vous,git fetch -p
sont à 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/A
pour tester trois approches différentes de quelque chose, puisorigin/A
disparaît. Maintenant, j'ai trois branches, qui ne peuvent évidemment pas toutes correspondre au nom, mais elles ont été créées à partir deorigin/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 ...la source
Cela supprimera les branches locales pour lesquelles les branches de suivi à distance ont été élaguées. (Assurez-vous que vous êtes en
master
succursale!)Détails:
git branch -vv
affiche "disparu" pour les succursales locales que la télécommande a été élaguée.-d
vérifiera s'il a été fusionné (-D
le supprimera malgré tout)la source
git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
git branch -d
compare les branches avecHEAD
.prunelocal = !sh -c \"git checkout -q master && git fetch -q --prune && git branch -vv | git grep ': gone]' | cut -d' ' -f3 | xargs git branch -d\"
On peut configurer Git pour supprimer automatiquement les références aux branches distantes supprimées lors de la récupération:
Lors de l'appel
git fetch
ougit pull
après, les références aux branches distantes supprimées sont supprimées automatiquement.la source
git branch -r
.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-branches
vous montrera toutes les branches locales périmées et lesgit removed-branches --prune
supprimera.Plus d'infos ici.
la source
npx git-removed-branches
fonctionne comme un rêve.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 principalegit remote update origin --prune
élagage des branches éloignéesgit branch -vv
obtient 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 branchela source
git remote prune origin
, select-string ne semble pas correspondre à la dernière version de git. Pensez à utiliserConvertFrom-String -TemplateContent
git checkout master; git pull; git remote prune origin; git branch --merged | select-string -notmatch "master" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}
Il répertorie les branches locales dont la branche de suivi à distance est supprimée de la télécommande
Si vous souhaitez déréférencer ces branches locales de locales qui ne sont pas suivies
la source
Comme le note @tzacks ... il existe un package npm qui est pratique pour cela. Faites juste:
(J'aurais commenté mais pas assez de réputation)
la source
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:
Explication
git
sortie pour chaque nom de branche restantCela vaut la peine de s'exécuter
git branch --merged
tout 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/ .)
la source
Une doublure encore plus courte et plus sûre:
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é.
la source
git branch -d $(git branch --merged | cut -c 3- | grep -v master)
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 simplementgit
, ou d'autres outils CLI simples, plutôt que d'écrire des scripts personnalisés. J'ai fini par utiliser un peu degrep
etawk
pour faire cette commande simple, puis je l'ai ajoutée comme alias dans mon~/.gitconfig
.Voici une
git config --global ...
commande pour ajouter facilement ceci commegit prune-branches
:REMARQUE: L'utilisation du
-D
drapeaugit branch
peut être très dangereuse. Donc, dans la commande config ci-dessus, j'utilise l'-d
optiongit branch
plutôt que-D
; J'utilise-D
dans ma config actuelle. J'utilise-D
parce 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-D
plutôt-d
qu'à la fin de cette commande de configuration.la source
Pour supprimer des branches distantes:
Pour supprimer des branches locales déjà fusionnées:
la source
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:
git branch -vv | grep 'gone]' > stale_branches.txt
awk '{print $1}' stale_branches.txt | xargs git branch -d
la source
Sur la base des réponses ci-dessus, j'utilise cette doublure plus courte:
De plus, si vous avez déjà taillé et avez des branches pendantes locales, cela les nettoiera:
la source
/
en euxJe 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é.la source
Vous pouvez utiliser cette commande:
Git Clean: supprimer les branches déjà fusionnées, y compris la rupture de commande
la source
Sur la base des réponses ci-dessus, je suis venu avec cette solution à une ligne:
la source
En utilisant une variante de la réponse de @ wisbucky, j'ai ajouté ce qui suit comme alias à mon
~/.gitconfig
fichier:Avec cela, un simple
git pruneitgood
nettoiera les branches locales et distantes qui ne sont plus nécessaires après les fusions.la source
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.la source
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):
Variante 2:
une. Essai à sec:
b. Supprimer les branches:
la source
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: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.
la source
:
ou:
(avec un espace) l'afindstr
fait 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\] "
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:
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.
la source
J'ai transformé la réponse acceptée en un script robuste. Vous le trouverez dans mon dépôt git-extensions .
la source
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 -d
will simplement avertir au lieu de supprimer les succursales locales non fusionnées.la source
À Powershell :
la source
Voici ma solution:
-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.
la source
git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
Supprimer toute branche qui n'est pas à jour avec le maître
la source
Je suis sûr que
git remote prune origin
c'est ce que vous voulez.Vous pouvez l'exécuter
git remote prune origin --dry-run
pour voir ce qu'il ferait sans apporter de modifications.la source
Vous utilisez l'interface graphique? Procédure manuelle, mais rapide et facile.
Sélectionnez "Branche -> Supprimer". Vous pouvez sélectionner plusieurs branches avec ctrl-clic (fenêtres) et les supprimer toutes.
la source