[PATCH v2] rebase: move state_dir to tmp prior to deletion
- From
Ben Woosley <ben.woosley@gmail.com>
- Date
- Jan 26, 2019, 10:16 UTC
- Message-ID
- <0102016889a9145a-83604d85-036b-409b-a3d2-2eb1ef2c5b95-000000@eu-west-1.amazonses.com>
- In-Reply-To
- <01020168891b1a3e-140bd175-a8cb-4379-a114-de68b1cac5d6-000000@eu-west-1.amazonses.com>
From: Ben Woosley <ben.woosley@gmail.com>
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 directoryOthers 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