|
@@ -0,0 +1,40 @@
|
|
|
+#!/usr/bin/env bash
|
|
|
+
|
|
|
+# This essentially makes the current commit empty so you can see the full diff
|
|
|
+# of the commit to be amended.
|
|
|
+#
|
|
|
+# This allows something similar to "Amend Last Commit" of git gui.
|
|
|
+
|
|
|
+set -euo pipefail
|
|
|
+
|
|
|
+old_commit=$(git rev-parse HEAD)
|
|
|
+
|
|
|
+git-fmt() {
|
|
|
+ git show -s --format="$1"
|
|
|
+}
|
|
|
+
|
|
|
+title=$(git-fmt %s)
|
|
|
+message=$(git-fmt %B)
|
|
|
+
|
|
|
+GIT_AUTHOR_NAME=$(git-fmt %an)
|
|
|
+GIT_AUTHOR_EMAIL=$(git-fmt %ae)
|
|
|
+GIT_AUTHOR_DATE=$(git-fmt %aD)
|
|
|
+GIT_COMMITTER_NAME=$(git-fmt %cn)
|
|
|
+GIT_COMMITTER_EMAIL=$(git-fmt %ce)
|
|
|
+GIT_COMMITTER_DATE=$(git-fmt %cD)
|
|
|
+
|
|
|
+export \
|
|
|
+ GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE \
|
|
|
+ GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL GIT_COMMITTER_DATE
|
|
|
+
|
|
|
+git reset --soft HEAD~1
|
|
|
+new_commit=$(git commit-tree -p HEAD 'HEAD^{tree}' -m "$message")
|
|
|
+
|
|
|
+git update-ref -m "amend-last: $title" HEAD "$new_commit"
|
|
|
+
|
|
|
+# If we're rebasing, git stores the current commit in rebase-merge/amend to
|
|
|
+# know whether --continue should result in an amend. If we don't update this,
|
|
|
+# --continue will complain that we have unstaged changes instead.
|
|
|
+if git rev-parse -q --verify rebase-merge/amend; then
|
|
|
+ git update-ref rebase-merge/amend "$new_commit" "$old_commit"
|
|
|
+fi
|