This will take a while to do.
-
Make a new clone of your repo.
git clone <repo> <repo>-bak cd <repo>-bak
-
Make a backup of all branches locally in case you fuck up something.
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done git fetch --all git pull --all # via https://stackoverflow.com/questions/10312521/how-to-fetch-all-git-branches#10312587
-
List all remote branches, oldest first
git for-each-ref --sort=committerdate refs/heads/ --format='%(committerdate:short) %(refname:short)' # via https://stackoverflow.com/a/16961359/1225741
-
Add this to your
.(zsh|bash)rc
git-is-merged() { merge_destination_branch=$1 merge_source_branch=$2 merge_base=$(git merge-base $merge_destination_branch $merge_source_branch) merge_source_current_commit=$(git rev-parse $merge_source_branch) if [[ $merge_base == $merge_source_current_commit ]]; then echo $merge_source_branch fi } git-list-merged() { git for-each-ref --sort=committerdate refs/heads/ --format='%(committerdate:short) %(refname:short)' > /tmp/zsh-git-refs-temp while read line; do git-is-merged HEAD $(echo $line | awk -F" " '{print $2}') #echo $line done < /tmp/zsh-git-refs-temp rm /tmp/zsh-git-refs-temp } git-rm-merged() { git-list-merged | egrep --invert-match '(master|sprint)' > /tmp/zsh-git-refs-merged-HEAD while read line; do echo git push origin --delete $line done < /tmp/zsh-git-refs-merged-HEAD rm /tmp/zsh-git-refs-merged-HEAD }
-
Source the changes in the rc file with
. ~/.zshrc
or. ~/.bashrc
. -
Run
git-rm-merged
(it's non-destructive, it will echo out what it would do). Adjust theegrep
to exclude branches that you want to leave untouched. Remove the echo if you feel confident about what will get deleted. -
Again source the file and run
git-rm-merged
:). -
Cleanup your rc file or restore the non-destructive version. Keep the repo in place for a couple months to have a way to restore branches if you did actually remove some that had to be left alone.
PS Tell me if it works on bash, I didn't test it there ;).