From: "Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Johannes Schindelin <johannes.schindelin@gmx.de>,
Johannes Schindelin <johannes.schindelin@gmx.de>
Subject: [PATCH] sequencer: release the ODB before spawning git commit
Date: Mon, 10 Aug 2026 19:04:48 +0000 [thread overview]
Message-ID: <pull.2198.git.1786388689444.gitgitgadget@gmail.com> (raw)
From: Johannes Schindelin <johannes.schindelin@gmx.de>
As of 4557f1add261 (rebase--helper: add a builtin helper for interactive
rebases, 2017-02-09), continuing an interactive rebase uses the builtin
sequencer, which spawns `git commit`.
The child may trigger auto-maintenance, which may need to replace files
for which the sequencer still holds resources. See
https://github.com/git-for-windows/git/issues/6315: on Windows, this
produces unlink retry prompts that cannot succeed while the sequencer
waits for the child.
Resources such as file handles or memory mappings must be released
before spawning a command that may run auto-maintenance, as established
by 28d04e1ec197 (run-command: offer to close the object store before
running, 2021-09-09).
Release the sequencer's ODB before spawning `git commit`. The regression
test uses the legacy-delete trick introduced by 69ed0e35a754 (mingw:
optionally use legacy (non-POSIX) delete semantics, 2026-05-07) to
trigger the failure on modern Windows.
Assisted-by: GPT-5.6 Sol
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
sequencer: release the ODB before spawning git commit
This fixes https://github.com/git-for-windows/git/issues/6315
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2198%2Fgit-for-windows%2Frebase-release-odb-before-commit-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2198/git-for-windows/rebase-release-odb-before-commit-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/2198
sequencer.c | 1 +
t/t3404-rebase-interactive.sh | 18 ++++++++++++++++++
2 files changed, 19 insertions(+)
diff --git a/sequencer.c b/sequencer.c
index 57855b0066..83952d96e3 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -1127,6 +1127,7 @@ static int run_git_commit(const char *defmsg,
struct child_process cmd = CHILD_PROCESS_INIT;
cmd.git_cmd = 1;
+ cmd.odb_to_close = the_repository->objects;
if (is_rebase_i(opts) &&
((opts->committer_date_is_author_date && !opts->ignore_date) ||
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index 58b3bb0c27..8f81c80fd4 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -65,6 +65,24 @@ test_expect_success 'setup' '
test_commit P fileP
'
+test_expect_success MINGW 'rebase releases object database before committing' '
+ test_when_finished "rm -f .git/hooks/post-commit repacked packs" &&
+ git switch -C repack-rewrite primary &&
+ git repack -ad &&
+ write_script .git/hooks/post-commit <<-\EOF &&
+ git repack -ad &&
+ >repacked
+ EOF
+ (
+ set_fake_editor &&
+ FAKE_LINES="reword 1" GIT_TEST_LEGACY_DELETE=1 \
+ git -c core.commitGraph=false rebase -i HEAD^
+ ) &&
+ test_path_is_file repacked &&
+ ls .git/objects/pack/*.pack >packs &&
+ test_line_count = 1 packs
+'
+
# "exec" commands are run with the user shell by default, but this may
# be non-POSIX. For example, if SHELL=zsh then ">file" doesn't work
# to create a file. Unsetting SHELL avoids such non-portable behavior
base-commit: e9019fcafe0040228b8631c30f97ae1adb61bcdc
--
gitgitgadget
next reply other threads:[~2026-08-10 19:04 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-10 19:04 Johannes Schindelin via GitGitGadget [this message]
2026-08-11 18:22 ` [PATCH] sequencer: release the ODB before spawning git commit Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.2198.git.1786388689444.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=johannes.schindelin@gmx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.