J'ai beaucoup de branches Git. Comment supprimer des branches déjà fusionnées? Existe-t-il un moyen simple de tous les supprimer au lieu de les supprimer un par un?
METTRE À JOUR:
Vous pouvez ajouter d'autres branches à exclure, telles que master et dev, si votre flux de travail les a comme ancêtre possible. D'habitude, je me sépare d'une balise "sprint-start" et maître, dev et qa ne sont pas des ancêtres.
Commencez par répertorier toutes les branches fusionnées dans Remote.
git branch --merged
Vous pouvez voir quelques branches que vous ne voulez pas supprimer. nous pouvons ajouter quelques arguments pour ignorer des branches importantes que nous ne souhaitons pas supprimer comme master ou develop. La commande suivante va ignorer la branche master et tout ce qui contient dev.
git branch --merged| egrep -v "(^\*|master|dev)"
Si vous voulez ignorer, vous pouvez l'ajouter à la commande egrep comme suit. La branche skip_branch_name
ne sera pas supprimée.
git branch --merged| egrep -v "(^\*|master|dev|skip_branch_name)"
Pour supprimer toutes les branches locales déjà fusionnées dans la branche extraite:
git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d
Vous pouvez voir que master et dev sont exclus s'ils sont des ancêtres.
Vous pouvez supprimer une branche locale fusionnée avec:
git branch -d branchname
Si ce n'est pas fusionné, utilisez:
git branch -D branchname
Pour le supprimer de la télécommande dans les anciennes versions de Git, utilisez:
git Push Origin :branchname
Dans les versions les plus récentes de Git, utilisez:
git Push --delete Origin branchname
Une fois que vous avez supprimé la branche de la télécommande, vous pouvez ajuster pour supprimer les branches de suivi à distance avec:
git remote Prune Origin
ou Taillez les branches individuelles de suivi à distance, comme le suggère l'autre réponse, avec:
git branch -dr branchname
J'espère que cela t'aides.
Pour supprimer toutes les branches de la télécommande déjà fusionnées:
git branch -r --merged | grep -v master | sed 's/Origin\//:/' | xargs -n 1 git Push Origin
Dans les versions les plus récentes de Git
git branch -r --merged | grep -v master | sed 's/Origin\///' | xargs -n 1 git Push --delete Origin
Prolongeant un peu la réponse d'Adam:
Ajoutez ceci à votre configuration Git en exécutant git config -e --global
[alias]
cleanup = "!git branch --merged | grep -v '\\*\\|master\\|develop' | xargs -n 1 git branch -d"
Et vous pouvez ensuite supprimer toutes les branches fusionnées locales en effectuant un simple git cleanup
.
Cela fonctionne également pour supprimer toutes les branches fusionnées sauf la branche principale.
git branch --merged | grep -v '^* master$' | grep -v '^ master$' | xargs git branch -d
Vous voudrez exclure les branches master
& develop
de ces commandes.
Local git clair:
git branch --merged | grep -v '\*\|master\|develop' | xargs -n 1 git branch -d
Git clair à distance:
git branch -r --merged | grep -v '\*\|master\|develop' | sed 's/Origin\///' | xargs -n 1 git Push --delete Origin
Synchronisez le registre local des branches distantes:
git fetch -p
Pour ceux d'entre vous qui travaillent sous Windows et préfèrent les scripts PowerShell, en voici un qui supprime les branches fusionnées locales:
function Remove-MergedBranches
{
git branch --merged |
ForEach-Object { $_.Trim() } |
Where-Object {$_ -NotMatch "^\*"} |
Where-Object {-not ( $_ -Like "*master" )} |
ForEach-Object { git branch -d $_ }
}
Git Sweep fait un excellent travail dans ce domaine.
Avec Git version 2.5.0:
git branch -d `git branch --merged`
J'ai utilisé la réponse d'Adam pendant des années maintenant. Cela dit, il y a des cas où cela ne s'est pas passé comme prévu:
1 & 2 étaient simples à aborder, avec juste un changement de regex. 3 dépend du contexte de ce que vous voulez (c’est-à-dire que supprimer uniquement les branches qui n’ont pas été fusionnées dans le maître ou contre votre branche actuelle) . 4 a le potentiel d’être désastreux (bien que récupérable avec git reflog
), si vous l'avez involontairement exécuté dans l'état HEAD détaché.
Enfin, je voulais que tout cela soit dans une ligne qui ne nécessite pas de script séparé (Bash | Ruby | Python).
Créez un "pseudo" git qui accepte un drapeau -f
optionnel:
git config --global alias.sweep '!f(){ git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d; }; f'
et l'invoquer avec:
git sweep
ou:
git sweep -f
Il était plus facile pour moi de créer un exemple de dépôt Git avec quelques branches et de nous engager à tester le comportement correct:
mkdir sweep-test && cd sweep-test && git init
echo "hello" > hello
git add . && git commit -am "initial commit"
git branch foo && git branch bar && git branch develop && git branch notmaster && git branch masterful
git branch --list
bar develop foo * master masterful notmaster
La regex originale manque les branches "masterful" et "notmaster":
git checkout foo
git branch --merged | egrep -v "(^\*|master|dev)"
bar
Avec la regex mise à jour (qui exclut maintenant "develop" plutôt que "dev"):
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar masterful notmaster
echo "foo" > foo
git add . && git commit -am "foo"
git checkout -b foobar
echo "foobar" > foobar
git add . && git commit -am "foobar"
Ma branche actuelle est foobar, et si je relance la commande ci-dessus pour répertorier les branches que je veux supprimer, la branche "foo" est incluse même si elle n'a pas été fusionnée dans le maître:
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar foo masterful notmaster
Cependant, si j'exécute la même commande sur le maître, la branche "foo" n'est pas incluse:
git checkout master && git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar masterful notmaster
Et ceci est simplement dû au fait que git branch --merged
est par défaut le HEAD de la branche actuelle, sauf indication contraire. Du moins pour mon flux de travail, je ne souhaite pas supprimer les branches locales à moins qu'elles aient été fusionnées avec le maître. Je préfère donc la variante suivante:
git checkout foobar
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
bar masterful notmaster
S'appuyer sur le comportement par défaut de git branch --merged
a des conséquences encore plus importantes dans l'état HEAD détaché:
git checkout foobar
git checkout HEAD~0
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar foo foobar masterful notmaster
Cela aurait supprimé la branche sur laquelle je venais juste de parler, "foobar" avec "foo", ce qui n'est certainement pas le résultat souhaité . Avec notre nouvelle commande, cependant:
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
bar masterful notmaster
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" | xargs git branch -d
git config --global alias.sweep '!f(){ git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d; }; f'
L'alias accepte un indicateur optionnel -f
. Le comportement par défaut consiste à ne supprimer que les branches fusionnées dans le maître, mais l'indicateur -f
supprime les branches fusionnées dans la branche actuelle.
git sweep
Deleted branch bar (was 9a56952). Deleted branch masterful (was 9a56952). Deleted branch notmaster (was 9a56952).
git sweep -f
Deleted branch foo (was 2cea1ab).
Vous pouvez ajouter le commit à l’option --merged . Ainsi, vous ne pourrez supprimer que les branches fusionnées dans l’origine/maître
La commande suivante supprimera les branches fusionnées de votre origine.
git branch -r --merged Origin/master | grep -v "^.*master" | sed s:Origin/:: |xargs -n 1 git Push Origin --delete
Vous pouvez tester quelles branches seront supprimées en remplaçant le git Push Origin --delete par echo
git branch -r --merged Origin/master | grep -v "^.*master" | sed s:Origin/:: |xargs -n 1 echo
J'utilise le script Ruby suivant pour supprimer mes branches locales et distantes déjà fusionnées. Si je le fais pour un référentiel avec plusieurs télécommandes et que je souhaite uniquement en supprimer, j'ajoute simplement une instruction select à la liste des télécommandes pour obtenir uniquement les télécommandes que je souhaite.
#!/usr/bin/env Ruby
current_branch = `git symbolic-ref --short HEAD`.chomp
if current_branch != "master"
if $?.exitstatus == 0
puts "WARNING: You are on branch #{current_branch}, NOT master."
else
puts "WARNING: You are not on a branch"
end
puts
end
puts "Fetching merged branches..."
remote_branches= `git branch -r --merged`.
split("\n").
map(&:strip).
reject {|b| b =~ /\/(#{current_branch}|master)/}
local_branches= `git branch --merged`.
gsub(/^\* /, '').
split("\n").
map(&:strip).
reject {|b| b =~ /(#{current_branch}|master)/}
if remote_branches.empty? && local_branches.empty?
puts "No existing branches have been merged into #{current_branch}."
else
puts "This will remove the following branches:"
puts remote_branches.join("\n")
puts local_branches.join("\n")
puts "Proceed?"
if gets =~ /^y/i
remote_branches.each do |b|
remote, branch = b.split(/\//)
`git Push #{remote} :#{branch}`
end
# Remove local branches
`git branch -d #{local_branches.join(' ')}`
else
puts "No branches removed."
end
end
git branch --merged | %{git branch -d $_.Trim()}
Voir GitHub pour Windows
Aucune commande dans Git ne le fera automatiquement pour vous. Mais vous pouvez écrire un script qui utilise les commandes Git pour vous donner ce dont vous avez besoin. Cela peut être fait de différentes manières en fonction du modèle de branchement que vous utilisez.
Si vous avez besoin de savoir si une branche a été fusionnée dans le maître, la commande suivante ne produira aucun résultat si myTopicBranch a été fusionné (c'est-à-dire que vous pouvez le supprimer).
$ git rev-list master | grep $(git rev-parse myTopicBranch)
Vous pouvez utiliser la commande Git branch et analyser toutes les branches de Bash et effectuer une boucle for
sur toutes les branches. Dans cette boucle, vous vérifiez avec la commande ci-dessus si vous pouvez supprimer la branche ou non.
la réponse de kuboon n'a pas été supprimée lors de la suppression des branches dont le nom principal est le mot maître .
git branch -r --merged | grep -v "Origin/master$" | sed 's/\s*Origin\///' | xargs -n 1 git Push --delete Origin
Bien sûr, cela ne supprime pas la branche "maître" elle-même :)
git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d
supprimera toutes les branches locales, à l'exception de la branche extraite actuelle et/ou de master
.
Voici un article utile pour ceux qui cherchent à comprendre ces commandes: Git Clean: Supprimer les branches déjà fusionnées, par Steven Harman .
Vous pouvez utiliser git-del-br
tool .
git-del-br -a
Vous pouvez l'installer via pip
en utilisant
pip install git-del-br
P.S: Je suis l'auteur de l'outil. Toutes les suggestions/commentaires sont les bienvenus.
Version alias de Réponse actualisée d'Adam :
[alias]
branch-cleanup = "!git branch --merged | egrep -v \"(^\\*|master|dev)\" | xargs git branch -d #"
Voir aussi cette réponse pour obtenir des conseils utiles sur la manière d’échapper aux alias complexes.
Si vous souhaitez supprimer toutes les branches locales déjà fusionnées dans la branche sur laquelle vous vous trouvez, j'ai créé une commande sûre pour le faire, basée sur les réponses précédentes:
git branch --merged | grep -v \* | grep -v '^\s*master$' | xargs -t -n 1 git branch -d
Cette commande n'affectera pas votre branche actuelle ni votre branche principale. Il vous dira également ce qu'il fait avant de le faire, en utilisant le drapeau -t de xargs.
La requête ci-dessous fonctionne pour moi
for branch in `git branch -r --merged | grep -v '\*\|master\|develop'|awk 'NR > 0 {print$1}'|awk '{gsub(/Origin\//, "")}1'`;do git Push Origin --delete $branch; done
et cela filtrera toute branche donnée du tuyau grep.
Fonctionne bien sur le clone http, mais pas très bien pour la connexion SSH.
Sur la base de certaines de ces réponses, j'ai créé mon propre script Bash pour le faire aussi !
Il utilise git branch --merged
et git branch -d
pour supprimer les branches qui ont été fusionnées et vous invite à chacune d’entre elles avant de les supprimer.
merged_branches(){
local current_branch=$(git rev-parse --abbrev-ref HEAD)
for branch in $(git branch --merged | cut -c3-)
do
echo "Branch $branch is already merged into $current_branch."
echo "Would you like to delete it? [Y]es/[N]o "
read REPLY
if [[ $REPLY =~ ^[Yy] ]]; then
git branch -d $branch
fi
done
}
J'utilise un système de nommage git-flow esque, donc cela fonctionne très bien pour moi:
git branch --merged | grep -e "^\s\+\(fix\|feature\)/" | xargs git branch -d
Fondamentalement, il recherche les validations fusionnées commençant par la chaîne fix/
ou feature/
.
Ecrivez un script dans lequel Git vérifie toutes les branches fusionnées pour être maîtrisées.
Alors faites git checkout master
.
Enfin, supprimez les branches fusionnées.
for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do
branchnew=$(echo $k | sed -e "s/Origin\///" | sed -e "s/remotes\///")
echo branch-name: $branchnew
git checkout $branchnew
done
git checkout master
for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do
branchnew=$(echo $k | sed -e "s/Origin\///" | sed -e "s/remotes\///")
echo branch-name: $branchnew
git Push Origin --delete $branchnew
done
La solution acceptée est plutôt bonne, mais le seul problème est qu'elle supprime également les branches locales non encore fusionnées dans une télécommande.
Si vous regardez la sortie de vous verrez quelque chose comme
$ git branch --merged master -v
api_doc 3a05427 [gone] Start of describing the Java API
bla 52e080a Update wording.
branch-1.0 32f1a72 [maven-release-plugin] prepare release 1.0.1
initial_proposal 6e59fb0 [gone] Original proposal, converted to AsciiDoc.
issue_248 be2ba3c Skip unit-for-type checking. This needs more work. (#254)
master be2ba3c Skip unit-for-type checking. This needs more work. (#254)
Les branches bla
et issue_248
sont des branches locales qui seraient supprimées en mode silencieux.
Mais vous pouvez également voir le Word [gone]
, qui indique les branches qui ont été poussées vers une télécommande (qui a maintenant disparu) et indique donc que les branches peuvent être supprimées.
La réponse originale peut donc être changée en (divisée en multiligne pour une longueur de ligne plus courte)
git branch --merged master -v | \
grep "\\[gone\\]" | \
sed -e 's/^..//' -e 's/\S* .*//' | \
xargs git branch -d
pour protéger les branches non encore fusionnées . De plus, le grepping pour que le maître le protège n'est pas nécessaire, car il possède une télécommande à l'origine et ne s'affiche pas.
Pour Windows, vous pouvez installer Cygwin et supprimer toutes les branches distantes à l'aide de la commande suivante:
git branch -r --merged | "C:\cygwin64\bin\grep.exe" -v master | "C:\cygwin64\bin\sed.exe" 's/Origin\///' | "C:\cygwin64\bin\xargs.exe" -n 1 git Push --delete Origin
Pour moi, git branch --merged
ne montre pas les branches qui ont été fusionnées via GitHub PR. Je ne suis pas sûr des raisons, mais j'utilise la ligne suivante pour supprimer toutes les branches locales qui n'ont pas de branche de suivi à distance:
diff <(git branch --format "%(refname:short)") <(git branch -r | grep -v HEAD | cut -d/ -f2-) | grep '<' | cut -c 3- | xargs git branch -D
Explication:
git branch --format "%(refname:short)"
donne une liste des branches localesgit branch -r | grep -v HEAD | cut -d/ -f2-
donne une liste des branches distantes, en filtrant HEAD
diff <(...) <(...)
donne un diff de sortie de deux commandes entre parenthèsesgrep '<'
filtre les branches présentes dans la première liste, mais pas dans la secondecut -c 3-
donne une ligne à partir du 3ème caractère, supprimant ainsi le préfixe <
xargs git branch -D
exécute git branch -D
pour chaque nom de brancheVous pouvez également éviter grep -v '<'
comme ceci:
diff --old-line-format="%L" --new-line-format="" --unchanged-line-format="" <(git branch --format "%(refname:short)") <(git branch -r | grep -v HEAD | cut -d/ -f2-) | xargs git branch -D
git branch --merged | grep -E -v "(master|test|dev)" | xargs git branch -d
où grep -E -v
est équivalent à egrep -v
Utilisez -d
pour supprimer déjà des branches merged ou -D
pour supprimer unmerged branches
Pour éviter d'exécuter accidentellement la commande depuis une autre branche que master, j'utilise le script bash suivant. Sinon, exécuter git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
à partir d'une branche qui a été fusionnée hors maître pourrait supprimer la branche principale.
#!/bin/bash
branch_name="$(git symbolic-ref HEAD 2>/dev/null)" ||
branch_name="(unnamed branch)" # detached HEAD
branch_name=${branch_name##refs/heads/}
if [[ $branch_name == 'master' ]]; then
read -r -p "Are you sure? [y/N] " response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]; then
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
fi
else
echo "Refusing to delete branches that are not merged into '$branch_name'. Checkout master first."
fi
Ajoutez ceci à la section [alias]
de votre ~/.gitconfig
:
sweep = !"f() { git branch --merged | egrep -v \"(^\\*|master|dev)\" || true | xargs git branch -d; }; f"
Maintenant, vous pouvez simplement appeler git sweep
pour effectuer le nettoyage nécessaire.
Pour supprimer les branches locales fusionnées dans la branche principale, j'utilise l'alias suivant (git config -e --global
):
cleanup = "!git branch --merged master | grep -v '^*\\|master' | xargs -n 1 git branch -D"
J'utilise git branch -D
pour éviter les messages error: The branch 'some-branch' is not fully merged.
alors que mon paiement actuel est différent de celui de la branche principale.
Script Python compatible avec Windoze (car git-sweep
est étouffé dans le référentiel Wesnoth):
#!/usr/bin/env python
# Remove merged git branches. Cross-platform way to execute:
#
# git branch --merged | grep -v master | xargs git branch -d
#
# Requires gitapi - https://bitbucket.org/haard/gitapi
# License: Public Domain
import gitapi
repo = gitapi.Repo('.')
output = repo.git_command('branch', '--merged').strip()
for branch in output.split('\n'):
branch = branch.strip()
if branch.strip(' *') != 'master':
print(repo.git_command('branch', '-d', branch).strip())
Si vous utilisez un modèle de branche tel que HubFlow ou GitFlow, vous pouvez utiliser cette commande pour supprimer les branches de fonctionnalité fusionnées:
git branch --merged | grep feature.* | grep -v "\*" | xargs -n 1 git branch -d
Voici le moyen de supprimer la branche git
git branch -D BranchName
Ma contribution au script Bash est basée approximativement sur la réponse de mmrobin .
Il faut quelques paramètres utiles pour spécifier les inclus et les exclure, ou pour examiner/supprimer uniquement les branches locales ou distantes au lieu des deux.
#!/bin/bash
# exclude branches regex, configure as "(branch1|branch2|etc)$"
excludes_default="(master|next|ag/doc-updates)$"
excludes="__NOTHING__"
includes=
merged="--merged"
local=1
remote=1
while [ $# -gt 0 ]; do
case "$1" in
-i) shift; includes="$includes $1" ;;
-e) shift; excludes="$1" ;;
--no-local) local=0 ;;
--no-remote) remote=0 ;;
--all) merged= ;;
*) echo "Unknown argument $1"; exit 1 ;;
esac
shift # next option
done
if [ "$includes" == "" ]; then
includes=".*"
else
includes="($(echo $includes | sed -e 's/ /|/g'))"
fi
current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
if [ "$current_branch" != "master" ]; then
echo "WARNING: You are on branch $current_branch, NOT master."
fi
echo -e "Fetching branches...\n"
git remote update --Prune
remote_branches=$(git branch -r $merged | grep -v "/$current_branch$" | grep -v -E "$excludes" | grep -v -E "$excludes_default" | grep -E "$includes")
local_branches=$(git branch $merged | grep -v "$current_branch$" | grep -v -E "$excludes" | grep -v -E "$excludes_default" | grep -E "$includes")
if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then
echo "No existing branches have been merged into $current_branch."
else
echo "This will remove the following branches:"
if [ "$remote" == 1 -a -n "$remote_branches" ]; then
echo "$remote_branches"
fi
if [ "$local" == 1 -a -n "$local_branches" ]; then
echo "$local_branches"
fi
read -p "Continue? (y/n): " -n 1 choice
echo
if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then
if [ "$remote" == 1 ]; then
remotes=$(git remote)
# Remove remote branches
for remote in $remotes
do
branches=$(echo "$remote_branches" | grep "$remote/" | sed "s/$remote\/\(.*\)/:\1 /g" | tr -d '\n')
git Push $remote $branches
done
fi
if [ "$local" == 1 ]; then
# Remove local branches
locals=$(echo "$local_branches" | sed 's/Origin\///g' | tr -d '\n')
if [ -z "$locals" ]; then
echo "No branches removed."
else
git branch -d $(echo "$locals" | tr -d '\n')
fi
fi
fi
fi
Si vous êtes sous Windows, vous pouvez utiliser Windows Powershell avec Out-GridView (malheureusement, il est déjà parti dans Powershell Core pour le moment) pour obtenir une belle liste de branches et sélectionner avec la souris celle que vous souhaitez supprimer:
git branch --merged | Out-GridView -PassThru | % { git branch -d $_.Trim() }
après avoir cliqué sur OK, Powershell passera ces noms de branches à la commande git branch -d
et les supprimera
for b in $(git branch -a | grep -v "\(master\|remotes\)"); do \
git branch -D $b; done && git fetch -p
git-delete-merged-branches
du git-extras
repo.
https://github.com/tj/git-extras/blob/master/Commands.md#git-delete-merged-branches
Disons que j'ai une télécommande nommée en amont et une origine (style GitHub, ma fourchette est Origine, en amont est en amont).
Je ne veux supprimer AUCUN maître, HEAD ou quoi que ce soit de l'amont. Je ne veux pas non plus supprimer la branche develop, car c’est notre branche commune à partir de laquelle nous créons des PR.
Répertorie toutes les branches distantes, filtrées par celles qui ont été fusionnées:
git branch -r
Supprimez de cette liste les lignes contenant des mots que je sais être dans les noms de branche que je ne souhaite pas supprimer:
sed '/develop\|master\|HEAD\|upstream/d'
Supprimez le nom distant du nom de référence (Origin/une branche devient une branche):
sed 's/.*\///'
Utilisez xargs pour appeler un one-liner:
xargs git Push --delete Origin
Pipe le tout ensemble vous obtenez:
git branch -r --merged | sed '/develop\|master\|HEAD\|upstream/d' | sed 's/.*\///' | xargs git Push --delete Origin
Cela ne me laissera que quelques branches sur lesquelles j'ai travaillé, mais qui n'ont pas été fusionnées. Vous pouvez ensuite les supprimer un par un car il ne devrait pas y en avoir trop.
Trouvez les branches que vous ne voulez plus:
git branch -ar
Supposons que vous trouviez branche1, branche2 et branche3 que vous souhaitez supprimer:
git Push --delete Origin branch1 branch2 branch3
$ git config --global alias.cleanup
'!git branch --merged Origin/master | egrep -v "(^\*|master|staging|dev)" | xargs git branch -d'
(divisé en plusieurs lignes pour plus de lisibilité)
L'appel à "git cleanup" supprimera les branches locales déjà fusionnées dans Origin/master. Il ignore master, staging et dev parce que nous ne voulons pas les supprimer dans des circonstances normales.
Pour résumer, voici ce qu'il fait:
git config --global alias.cleanup
!
au début de la commande indique que nous utiliserons des commandes non git dans le cadre de cet alias. Nous devons donc exécuter les commandes bash ici.git branch --merged Origin/master
Origin/master
egrep -v "(^\*|master|staging|dev)"
xargs git branch -d
git branch -d xxxxx
pour chacune des branches non fusionnées. Cela supprime les branches locales une par une.J'utilise la méthode suivante pour supprimer les branches locales et distantes fusionnées dans un cmd.
J'ai les éléments suivants dans mon fichier bashrc
:
function rmb {
current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
if [ "$current_branch" != "master" ]; then
echo "WARNING: You are on branch $current_branch, NOT master."
fi
echo "Fetching merged branches..."
git remote Prune Origin
remote_branches=$(git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$")
local_branches=$(git branch --merged | grep -v 'master$' | grep -v "$current_branch$")
if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then
echo "No existing branches have been merged into $current_branch."
else
echo "This will remove the following branches:"
if [ -n "$remote_branches" ]; then
echo "$remote_branches"
fi
if [ -n "$local_branches" ]; then
echo "$local_branches"
fi
read -p "Continue? (y/n): " -n 1 choice
echo
if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then
# Remove remote branches
git Push Origin `git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$" | sed 's/Origin\//:/g' | tr -d '\n'`
# Remove local branches
git branch -d `git branch --merged | grep -v 'master$' | grep -v "$current_branch$" | sed 's/Origin\///g' | tr -d '\n'`
else
echo "No branches removed."
fi
fi
}
original source
Cela ne supprime pas la branche principale, mais supprime les branches locales et distantes fusionnées. Une fois que vous avez ceci dans votre fichier rc, exécutez simplement rmb
, vous verrez une perte de branches fusionnées qui seront nettoyées et une confirmation de l’action sera demandée. Vous pouvez modifier le code pour ne pas demander de confirmation également, mais il est probablement bon de le conserver.
Si vous souhaitez supprimer les branches locales qui ont été fusionnées ainsi que leurs télécommandes, voici le modèle que je préfère:
git branch --merged | xargs -I_br -- sh -c 'git branch -d _br; git Push Origin --delete _br'