tools: Add git utility scripts.
This commit is contained in:
parent
d05e932968
commit
ea105ffec5
7 changed files with 242 additions and 0 deletions
70
tools/clean-branches
Normal file
70
tools/clean-branches
Normal file
|
@ -0,0 +1,70 @@
|
|||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
# usage: clean-branches
|
||||
# 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-*.
|
||||
|
||||
# usage: clean-branches --reviews
|
||||
# Deletes all the above mentioned branches as well as branches
|
||||
# created by the scripts like `fetch-rebase-pull-request`. Be careful
|
||||
# as this would also remove other branches woth names like review-*
|
||||
|
||||
review=0
|
||||
if [ $# -ne 0 ] && [ "$1" == "--reviews" ]; then
|
||||
review=1
|
||||
fi
|
||||
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/review-*)
|
||||
if [ $review -ne 0 ]; then
|
||||
echo -n "Deleting local branch $(echo "$ref" | sed 's!^refs/heads/!!')"
|
||||
echo " (was $(git rev-parse --short "$ref"))"
|
||||
git update-ref -d "$ref"
|
||||
fi
|
||||
;;
|
||||
|
||||
refs/heads/*)
|
||||
if is_merged "$ref"; then
|
||||
echo -n "Deleting local branch $(echo "$ref" | sed 's!^refs/heads/!!')"
|
||||
echo " (was $(git rev-parse --short "$ref"))"
|
||||
git update-ref -d "$ref"
|
||||
fi
|
||||
;;
|
||||
|
||||
refs/remotes/origin/$USER-*)
|
||||
if is_merged "$ref"; then
|
||||
remote_name="$(echo "$ref" | sed 's!^refs/remotes/origin/!!')"
|
||||
echo -n "Deleting remote branch $remote_name"
|
||||
echo " (was $(git rev-parse --short "$ref"))"
|
||||
# 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 [ "${#push_args}" -ne 0 ]; then
|
||||
git push origin "${push_args[@]}"
|
||||
fi
|
Loading…
Add table
Add a link
Reference in a new issue