aboutsummaryrefslogtreecommitdiff
path: root/shellrc.d/git
diff options
context:
space:
mode:
Diffstat (limited to 'shellrc.d/git')
-rw-r--r--shellrc.d/git29
1 files changed, 29 insertions, 0 deletions
diff --git a/shellrc.d/git b/shellrc.d/git
new file mode 100644
index 0000000..47edae5
--- /dev/null
+++ b/shellrc.d/git
@@ -0,0 +1,29 @@
+# vim: ft=sh:
+
+# 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="$(git worktree list | sed -nE "/\[$1\]/{s/([^ ]+) .*/\1/p}")"
+ 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"
+ )
+}
+
+# Create new branch from HEAD
+gitbnew() {
+ git branch "$1" HEAD
+ local NW="$(git rev-parse --show-toplevel)-$1"
+ git worktree add "$NW" $1
+ cd "$NW"
+ git submodule update --init --recursive
+}