Skip to content

Instantly share code, notes, and snippets.

@schacon
Created April 26, 2011 19:19
Show Gist options
  • Save schacon/942899 to your computer and use it in GitHub Desktop.
Save schacon/942899 to your computer and use it in GitHub Desktop.
delete all remote branches that have already been merged into master
$ git branch -r --merged |
grep origin |
grep -v '>' |
grep -v master |
xargs -L1 |
awk '{split($0,a,"/"); print a[2]}' |
xargs git push origin --delete
@030
Copy link

030 commented Sep 19, 2018

Could you replace the current awk statement that resides in the gist file with the suggestion by @catsby, i.e. awk '{sub(/origin\//,"");print}'?

@christopher-hopper
Copy link

Here's a bash version, that doesn't rely on awk or sed or xargs.

for branch in $(git branch -r --merged master | grep origin | grep -v develop | grep -v master);
do
  git push origin --delete "${branch##*/}";
done

@ryan-collingham
Copy link

Here's a bash version, that doesn't rely on awk or sed or xargs.

for branch in $(git branch -r --merged master | grep origin | grep -v develop | grep -v master);
do
  git push origin --delete "${branch##*/}";
done

Clearest solution I've seen, it makes the intent much more explicit than a long chain of awk/sed/xarg calls.

Only thing I'd add is that it doesn't quite work for branches that have a '/' in the name - if branch="origin/foo/bar" then ${branch##*/} will be "bar" and not "foo/bar"! You can fix by using the non-greedy single # to match the substring:

for branch in $(git branch -r --merged master | grep origin | grep -v develop | grep -v master)
do
  git push origin --delete "${branch#*/}"
done

@ryanc414
Copy link

ryanc414 commented Jul 1, 2019

My solution to prune merged branches from local + multiple remotes, based on snippets above:

https://gist.github.com/ryanc414/f7686d2c97808b41ed8518a5840e2d78

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment