#!/usr/bin/env dash # shellcheck source=/dev/null SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH help() { cat << EOF Automatically remove merged branches (remote and local) USAGE: git-cleanup [OPTIONS] OPTIONS: --remote | -r Act on remote branches --help | -h Display this help and exit. --version | -v Display version and copyright information and exit. EOF } # This should always be the correct answer. get_default_branch() { # source: https://stackoverflow.com/a/50056710 # We assume, that 'origin' is the remote in use git remote show origin | sed -n '/HEAD branch/s|.*: ||p' } cleanup() { default_branch="$(get_default_branch)"; merged_branches="$(git branch --merged "$default_branch" --no-contains "$default_branch" --format='%(refname:short)')"; [ "$merged_branches" ] && git branch --delete "$merged_branches" } cleanup_remote() { default_branch="$(get_default_branch)"; merged_branches="$(git branch --remotes --merged "$default_branch" --no-contains "$default_branch" --format='%(refname:short)' | sed 's|origin/||')"; [ "$merged_branches" ] && git push --delete origin "$merged_branches" } remote=false; for arg in "$@"; do case "$arg" in "--help" | "-h") help; exit 0; ;; "--version" | "-v") version; exit 0; ;; "--remote" | "-r") remote=true; ;; esac done if [ "$remote" = "true" ]; then cleanup_remote; elif [ "$remote" = "false" ]; then cleanup; else die "BUG: 'remote' is not true or false but: '$remote'"; fi # vim: ft=sh