From: Ben Woosley <[email protected]>
To avoid partial deletion / zombie rebases.
Example behavior under partial deletion, after
Ctrl-Cing out of a standard rebase:
$ git rebase target
First, rewinding head to replay your work on top of it...
Applying: [...]
^C
$ git status
rebase in progress; onto (null)
You are currently rebasing.
(all conflicts fixed: run "git rebase --continue")
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
[...]
$ git rebase --continue
error: could not read '.git/rebase-apply/head-name': No such file or
directory
$ git rebase --abort
error: could not read '.git/rebase-apply/head-name': No such file or
directory
Others report this issue here:
https://stackoverflow.com/questions/3685001/git-how-to-fix-corrupted-interactive-rebase
---
git-legacy-rebase.sh | 17 ++++++++++++++---
git-rebase--preserve-merges.sh | 2 +-
2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/git-legacy-rebase.sh b/git-legacy-rebase.sh
index b4c7dbfa575d3..832a211c925c3 100755
--- a/git-legacy-rebase.sh
+++ b/git-legacy-rebase.sh
@@ -128,11 +128,22 @@ read_basic_state () {
}
}
+remove_rebase_state () {
+ removal_dir=$(mktemp -d -t "git-rebase-state-XXXXXX")
+ if test -d "$removal_dir"
+ then
+ mv "$state_dir" "$removal_dir"
+ else
+ removal_dir="$state_dir"
+ fi
+ rm -rf "$removal_dir"
+}
+
finish_rebase () {
rm -f "$(git rev-parse --git-path REBASE_HEAD)"
apply_autostash &&
{ git gc --auto || true; } &&
- rm -rf "$state_dir"
+ remove_rebase_state
}
run_interactive () {
@@ -194,7 +205,7 @@ run_specific_rebase () {
elif test $ret -eq 2 # special exit status for rebase -p
then
apply_autostash &&
- rm -rf "$state_dir" &&
+ remove_rebase_state &&
die "Nothing to do"
fi
exit $ret
@@ -439,7 +450,7 @@ abort)
exit
;;
quit)
- exec rm -rf "$state_dir"
+ remove_rebase_state
;;
edit-todo)
run_specific_rebase
diff --git a/git-rebase--preserve-merges.sh b/git-rebase--preserve-merges.sh
index afbb65765d461..146b52df14928 100644
--- a/git-rebase--preserve-merges.sh
+++ b/git-rebase--preserve-merges.sh
@@ -226,7 +226,7 @@ Once you are satisfied with your changes, run
die_abort () {
apply_autostash
- rm -rf "$state_dir"
+ remove_rebase_state
die "$1"
}
--
https://github.com/git/git/pull/569