2012-11-06 20:38:26 +01:00
|
|
|
#!/bin/bash -e
|
|
|
|
|
|
|
|
# Deletes any local branches which are ancestors of origin/master,
|
|
|
|
# and also any branches in origin which are ancestors of
|
|
|
|
# origin/master and are named like $USER-*.
|
|
|
|
|
|
|
|
push_args=''
|
|
|
|
|
|
|
|
function is_merged {
|
|
|
|
! git rev-list -n 1 origin/master.."$1" | grep -q .
|
|
|
|
}
|
|
|
|
|
|
|
|
function clean_ref {
|
|
|
|
ref="$1"
|
|
|
|
case "$ref" in
|
|
|
|
*/master | */HEAD)
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
|
|
|
|
refs/heads/*)
|
|
|
|
if is_merged "$ref"; then
|
2012-11-06 21:12:48 +01:00
|
|
|
echo -n "Deleting local branch $(echo "$ref" | sed 's!^refs/heads/!!')"
|
|
|
|
echo " (was $(git rev-parse --short "$ref"))"
|
2012-11-06 20:38:26 +01:00
|
|
|
git update-ref -d "$ref"
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
|
|
|
|
refs/remotes/origin/$USER-*)
|
|
|
|
if is_merged "$ref"; then
|
|
|
|
remote_name="$(echo "$ref" | sed 's!^refs/remotes/origin/!!')"
|
2012-11-06 21:12:48 +01:00
|
|
|
echo -n "Deleting remote branch $remote_name"
|
|
|
|
echo " (was $(git rev-parse --short "$ref"))"
|
2012-11-06 20:38:26 +01:00
|
|
|
# NB: this won't handle spaces in ref names
|
|
|
|
push_args="$push_args :$remote_name"
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
|
|
|
if [ "$(git symbolic-ref HEAD)" != 'refs/heads/master' ]; then
|
|
|
|
echo "Check out master before you run this script." >&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
git fetch --prune origin
|
|
|
|
|
|
|
|
eval $(git for-each-ref --shell --format='clean_ref %(refname);')
|
|
|
|
|
|
|
|
if [ -n "$push_args" ]; then
|
|
|
|
git push origin $push_args
|
|
|
|
fi
|