feat(config): add ignore_worktrees to skip linked git worktrees - #1430
feat(config): add ignore_worktrees to skip linked git worktrees#1430vitalNohj wants to merge 3 commits into
Conversation
|
Thanks for opening this — it has been seen, and it is queued. This note is automated, but it is not a brush-off: it exists so you know where your PR stands instead of having to guess from silence. Current review status: working through a backlog. What that means for this PR, concretely:
Things that will genuinely speed it up whenever review does happen:
If this fixes a bug, a reproduction we can run is worth more than a description of the symptom. Thanks for contributing, and sorry in advance for the wait. |
Agents that use `git worktree add` to run parallel branches end up with one
indexed project per worktree. Each is a near-duplicate of the main checkout,
so the cache fills with redundant graphs and project pickers get noisy.
Add an opt-in `ignore_worktrees` config key. When enabled, a linked worktree
is left alone:
- auto-index on connect skips it (logged as autoindex.skip)
- the daemon's background auto-index skips it
- explicit index_repository refuses with an actionable message naming both
ways forward (index_worktree=true, or turn the key off)
- the hook-augment "not indexed" guidance stops telling the agent to run
index_repository in a directory where it would only be refused
Detection is git plumbing, no subprocess: <path>/.git must be a regular file
holding a "gitdir:" pointer AND that gitdir must contain a `commondir` file.
The commondir check is what separates a linked worktree from a submodule,
whose .git is also a gitlink file but whose gitdir has no commondir. The main
checkout of a repo that has worktrees is never affected.
Defaults to false, so behaviour is unchanged unless the key is set.
Signed-off-by: Nohj <vitalnohj@gmail.com>
The macos-14 TSan leg failed in test_mcp.c's DeusData#853 auto_watch guard, which runs a real indexing worker in a forked child under a wall-clock alarm(60). That budget is timing-sensitive under TSan instrumentation on the macOS runners and is unrelated to this change: the ignore_worktrees gate short-circuits on the config key, so with the key unset (the default, and what that test uses) the worktree check is never evaluated. Signed-off-by: Nohj <vitalnohj@gmail.com>
1003528 to
d21918c
Compare
|
Thank you for the focused |
Problem
Agent workflows increasingly use
git worktree addto run several branches of the same repo side by side. Every worktree is discovered as its own project, so the cache accumulates a near-duplicate graph per worktree and project pickers get noisy. Today there is no way to say "index the main checkout, leave the worktrees alone".Change
Adds an opt-in
ignore_worktreesconfig key. When enabled, a linked worktree is left alone across every indexing entry point:autoindex.skipwithreason=linked_worktree)index_repositoryrefuses with an actionable message naming both ways forwardindex_repositoryin a directory where it would only be refusedThe explicit call keeps an escape hatch —
index_worktree=trueindexes a worktree regardless of the setting, so the key never becomes a dead end:Default is
false, so nothing changes for existing users unless they opt in.Detection
cbm_git_is_linked_worktree()is git plumbing only, no subprocess — it runs on every session start, so shelling out the waycbm_git_context_resolve()does was not an option.<path>/.gitmust be a regular file holding agitdir:pointer and that gitdir must contain acommondirfile.That second condition is the important one: a submodule's
.gitis also a gitlink file, so a naive "is.gita regular file?" check misclassifies every submodule as a worktree. A submodule's gitdir (<super>/.git/modules/<name>) has nocommondirentry, which separates the two cleanly. The main checkout of a repo that has worktrees is never affected.Tests
tests/test_git_context.c— detection truth table: linked worktree true; the main checkout of that same repo false; a submodule false; a plain non-git dir false.tests/test_mcp.c— the config gate on explicitindex_repository: worktree refused, main checkout not refused, andindex_worktree=trueescaping the gate.Both follow the existing fixture patterns in those files (
th_mktempdir/th_rmtree,SKIP_PLATFORMon Windows, graceful skip when git is unavailable).Verification
scripts/build.sh— cleanscripts/test.sh— 6661 passed, 0 failed (116 suites)make -f Makefile.cbm security— all 8 layers passlint-format) and cppcheck — clean; clang-tidy reports 0 findings on the added linesindex_worktree=trueoverride, and unchanged default-off behaviourDocs
docs/CONFIGURATION.mdgets a table row plus a section covering motivation, the enable command, all three behaviours, and the submodule/main-checkout caveat.README.mdgets a short paragraph next toauto_watch.