Last active
May 27, 2023 14:44
-
-
Save TBonnin/4060788 to your computer and use it in GitHub Desktop.
Safely remove local fully merged branches
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# This has to be run from master | |
git checkout master | |
# Update our list of remotes | |
git fetch | |
git remote prune origin | |
# Remove local fully merged branches | |
git branch --merged master | grep -v 'master$' | xargs git branch -d | |
# Show remote fully merged branches | |
echo "The following remote branches are fully merged and will be removed:" | |
git branch -r --merged master | sed 's/ *origin\///' | grep -v 'master$' | |
read -p "Continue (y/n)? " | |
if [ "$REPLY" == "y" ] | |
then | |
# Remove remote fully merged branches | |
git branch -r --merged master | sed 's/ *origin\///' \ | |
| grep -v 'master$' | xargs -I% git push origin :% | |
echo "Done!" | |
say "Obsolete branches are removed" | |
fi | |
echo "Please, tell your teammates to run 'git remote prune origin' command in order to clean their local repository" | |
@himdel Just a tip to simplify your sed work, you can use any delimiter to avoid escaping, e.g.: sed 's|^origin/||g'
If you want to detect squash merges and the likes as well, git-delete-merged-branches may be of interest.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The script fails when used with more remotes with branches than origin, and assumes master is up to date with upstream, so simplified a bit with that in mind:
EDIT: added
-r
to xargs to skip empty lists