# vim: ft=sh: # Get path to worktree for git branch _gitbworktree() { git worktree list --porcelain | \ awk -v ref="refs/heads/$1" \ '/^worktree / { worktree = $2 }; /^branch / { if ($2 == ref) { print worktree }}' } # Automatic branch merger (merge branch, push it to server and remove branch) # Expects name of the branch as argument # It fails if it's not fast forward merge and if there is fixup! commit. gitbmerge() ( set -e if [ -n "$(git log --grep="^fixup\!" HEAD.."$1")" ]; then echo "First squash fixups!" exit 1 fi local wt wt="$(_gitbworktree "$1")" if [ -n "$wt" ]; then rm -r "$wt" git worktree prune fi git merge --ff-only "$1" && git push && git branch -d "$1" && git push origin :"$1" ) # Checkout branch to new work tree gitbcheckout() { local nw nw="$(git rev-parse --show-toplevel)-$1" git worktree add "$nw" "$1" cd "$nw" git submodule update --no-fetch --init --recursive } alias gitbco='gitbcheckout' # Create new branch from HEAD gitbnew() { git branch "$1" HEAD gitbcheckout "$1" }