From 808243babc2fdb6a51202a1b152eadf2c1907beb Mon Sep 17 00:00:00 2001 From: Benedikt Heine Date: Fri, 25 Jul 2025 11:25:24 +0200 Subject: [PATCH] Add git-rewrite-commits --- bin/git-rewrite-commits.sh | 32 ++++++++++++++++++++++++++++++++ install.conf.yaml | 1 + 2 files changed, 33 insertions(+) create mode 100755 bin/git-rewrite-commits.sh diff --git a/bin/git-rewrite-commits.sh b/bin/git-rewrite-commits.sh new file mode 100755 index 0000000..217aa60 --- /dev/null +++ b/bin/git-rewrite-commits.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +# Automatically start a rebase for all commits between HEAD and the main +# branch without integrating new commits from the main branch +# +# Technically it's a git rebase without rebasing any commits. + +# Enforce being in a git repository +git rev-parse --is-inside-work-tree >/dev/null || exit $? + +# We actually should check out the head branch via `git remote show ${REMOTE}`, +# but this requires active connection and active 2FA verification. Tedious to +# have multiple calls for this +if git rev-parse --verify main &>/dev/null; then + MAIN_BRANCH=main +else + MAIN_BRANCH=master +fi + +CURRENT_BRANCH="$(git rev-parse --abbrev-ref HEAD)" + +if [ "${CURRENT_BRANCH}" = "${MAIN_BRANCH}" ]; then + echo "Cannot rebase commits from '${CURRENT_BRANCH}' (HEAD) onto '${MAIN_BRANCH}'" >&2 + exit 1 +fi + +MERGE_BASE="$(git merge-base "${MAIN_BRANCH}" HEAD)" + +# Show the next command +set -x + +git rebase --interactive "${MERGE_BASE}" diff --git a/install.conf.yaml b/install.conf.yaml index cf302c1..6a77719 100644 --- a/install.conf.yaml +++ b/install.conf.yaml @@ -77,6 +77,7 @@ ~/.local/bin/host-is-on: bin/host-is-on.sh ~/.local/bin/git-authors: bin/git-authors.sh ~/.local/bin/git-ard: bin/git-ard.sh + ~/.local/bin/git-rewrite-commits: bin/git-rewrite-commits.sh ~/.local/bin/clean: bin/clean.sh # systemd