feat(config): add ignore_worktrees to skip linked git worktrees - #1430
Open
vitalNohj wants to merge 2 commits into
Open
feat(config): add ignore_worktrees to skip linked git worktrees#1430vitalNohj wants to merge 2 commits into
vitalNohj wants to merge 2 commits into
Conversation
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>
|
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. |
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.