Re: [PATCH v2 1/1] fsck: ignore missing "refs" directory for linked worktrees
From: Kristoffer Haugsbakk <hidden>
Date: 2025-06-02 14:00:30
On Mon, Jun 2, 2025, at 15:29, shejialuo wrote:
"git refs verify" doesn't work if there are worktrees created on Git
v2.43.0 or older versions. These versions don't automatically create the
"refs" directory, causing the error:
error: cannot open directory .git/worktrees/<worktree name>/refs:
No such file or directoryGood.
Since 8f4c00de95 (builtin/worktree: create refdb via ref backend, 2024-01-08), we automatically create the "refs" directory for new worktrees. And in 7c78d819e6 (ref: support multiple worktrees check for refs, 2024-11-20), we assume that all linked worktrees have this directory and would wrongly report an error to the user, thus introducing compatibility issue.
Okay, you don’t mention c1cf918d3ad (builtin/fsck: add `git refs verify` child process, 2025-02-28) in the commit message because of your reply:
quoted
Because we would call "git refs verify" subprocess in "git-fsck(1)" in this release cycle, I just want to fix this problem before the release. Thus, it won't affect the users.
https://lore.kernel.org/git/a2a50127-6ab9-4d8a-abcc-b1a741df293e@app.fastmail.com/T/#m01231abb77735b0f480743e0d2adecc172e1f170 (local) Which I just mention here for completeness and my own memory. ;) All good.
Check for ENOENT errno before reporting directory access errors for linked worktrees to maintain backward compatibility. Reported-by: Kristoffer Haugsbakk <redacted> Signed-off-by: shejialuo <redacted> [snip] +test_expect_success 'no refs directory of worktree should not cause problems' ' + test_when_finished "rm -rf repo" && + git init repo && + ( + cd repo && + test_commit initial && + git worktree add --detach ./worktree && + + cd worktree &&
Now in this version you change-directory into `worktree`. You would need a new subshell for that (test style). But I don’t see the need to chdir in the first place?
+ worktree_refdir="$(git rev-parse --git-dir)/refs" && + # Simulate old directory layout + rmdir "$worktree_refdir" && + git refs verify 2>err && + test_must_be_empty err + ) +' + test_expect_success 'ref name check should work for multiple worktrees' ' test_when_finished "rm -rf repo" && git init repo && -- 2.49.0
The test passes for me. Also when applying only the test (and not the fix) the test fails as expected. Good.