Thread (19 messages) 19 messages, 6 authors, 2025-06-02

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 directory
Good.
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.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help