From: Ben Woosley <ben.woosley@xxxxxxxxx> 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