Skip to content

fix(project): use git common dir for bare repo project cache#19054

Merged
jlongster merged 2 commits into
anomalyco:devfrom
TimeWarpEngineering:Cramer/2026-03-25/bare-repo-bug
Apr 22, 2026
Merged

fix(project): use git common dir for bare repo project cache#19054
jlongster merged 2 commits into
anomalyco:devfrom
TimeWarpEngineering:Cramer/2026-03-25/bare-repo-bug

Conversation

@StevenTCramer
Copy link
Copy Markdown
Contributor

@StevenTCramer StevenTCramer commented Mar 25, 2026

Issue for this PR

Closes #18045

Type of change

  • Bug fix
  • New feature
  • Refactor / code improvement
  • Documentation

What does this PR do?

This fixes project ID cache placement for bare-repo-backed worktrees.

Before this change, cache read/write used worktree/.git/opencode. In bare repo setups, worktree resolves to the parent of the bare repo, so cache could be written to a shared parent path like <parent>/.git/opencode.

This PR reads and writes cache at git rev-parse --git-common-dir (common/opencode) instead. That is the correct git metadata location for normal repos, worktrees, and bare repos.

I also added regression tests for:

  • bare repo worktree cache path (must be in <bare>.git/opencode, not parent)
  • sibling bare repos under one parent (must not share IDs via parent cache)

How did you verify your code works?

  • Ran bun test --timeout 30000 test/project/ in packages/opencode
  • New bare-repo tests fail on old behavior and pass with this fix
  • Manually validated no cache is created at the incorrect parent .git/opencode path

Screenshots / recordings

N/A (no UI changes)

Checklist

  • I have tested my changes locally
  • I have not included unrelated changes in this PR

@github-actions github-actions Bot added contributor needs:compliance This means the issue will auto-close after 2 hours. labels Mar 25, 2026
@github-actions
Copy link
Copy Markdown
Contributor

The following comment was made by an LLM, it may be inaccurate:

Based on my search, I found one potentially related PR that might be addressing similar concerns:

Related PR:

This PR appears related because it also deals with project IDs across worktrees, which is the same domain as the current PR. However, this is likely a different fix addressing a different aspect of the worktree/project identity issue.

No exact duplicate PRs found addressing the same bare repo cache placement issue described in PR #19054.

@github-actions github-actions Bot removed the needs:compliance This means the issue will auto-close after 2 hours. label Mar 25, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Thanks for updating your PR! It now meets our contributing guidelines. 👍

@StevenTCramer StevenTCramer force-pushed the Cramer/2026-03-25/bare-repo-bug branch from fafcb9a to 5fc5fbc Compare March 25, 2026 04:27
@jlongster
Copy link
Copy Markdown
Contributor

I think a better fix is to focus on the worktree variable and make that correct. We also want worktree to be correct in the database for the project row, and your fix only fixes the .git resolution to store the project id. If you fix the worktree variable, it will be both of these issues

I would improve this line:

          const worktree = common === sandbox ? sandbox : pathSvc.dirname(common)

Is there a way to detect a bare repo? I would try to detect that, and just keep worktree pointed at the bare repo itself if so

@StevenTCramer
Copy link
Copy Markdown
Contributor Author

Good point on fixing the worktree variable directly. I've updated the PR to detect bare repos and set worktree = common for them.

Regarding bare repo detection: I considered using git rev-parse --is-bare-repository but opted for a path-based heuristic instead:

const commonName = pathSvc.basename(common)
const isBareRepo = commonName.endsWith(".git") && commonName !== ".git"

This avoids spawning an extra git process (~50-100ms overhead) in a hot path. The heuristic correctly identifies bare repos (e.g., bare.git) while excluding regular .git directories. If edge cases emerge, we can add the git command as a fallback.

@StevenTCramer StevenTCramer force-pushed the Cramer/2026-03-25/bare-repo-bug branch 2 times, most recently from 725c405 to d462551 Compare March 27, 2026 01:56
@StevenTCramer
Copy link
Copy Markdown
Contributor Author

The e2e (windows) failure is a known flaky test (prompt-slash-terminal.spec.ts) that times out waiting for the terminal panel UI element. This test has failed intermittently on other recent PRs as well (e.g., runs 23625820101, 23625290137) and is unrelated to the project.ts changes in this PR.

@jlongster This is a pre-existing flaky E2E test, not a regression from this change.

@StevenTCramer StevenTCramer force-pushed the Cramer/2026-03-25/bare-repo-bug branch 2 times, most recently from d462603 to ce91176 Compare March 28, 2026 21:22
@StevenTCramer StevenTCramer force-pushed the Cramer/2026-03-25/bare-repo-bug branch 3 times, most recently from 691d6c4 to e50f146 Compare April 21, 2026 02:51
Use git-common-dir as the project ID cache location so bare-repo-backed worktrees do not write to a shared parent .git path. Add regression tests that reproduce parent-path cache collisions across bare repos.
Detect bare repos by checking if git-common-dir basename ends with .git (excluding .git itself). This ensures both the worktree field in the database and the cache location are correct for bare-repo-backed worktrees.
@StevenTCramer StevenTCramer force-pushed the Cramer/2026-03-25/bare-repo-bug branch from e50f146 to ee0ca05 Compare April 21, 2026 14:49
@StevenTCramer
Copy link
Copy Markdown
Contributor Author

Update: reversed course on the bare-repo detection. The filename heuristic wasn't actually sound — .git is just git clone --bare's default suffix, but bare repos can be named anything (e.g., git init --bare my-repo produces a bare repo with no suffix).

Swapped to git config --bool core.bare, which is authoritative — that's literally how git defines "bare." The perf concern that drove the original heuristic doesn't really hold up either: Project.fromDirectory runs once per project open, not per operation, so the extra git subprocess (~20ms) is invisible.

One side note for anyone reading this later: git rev-parse --is-bare-repository would not have worked here. From inside a worktree of a bare repo, the worktree itself isn't bare, so rev-parse --is-bare-repository returns false. git config --bool core.bare works correctly from either location because git resolves it through the common-dir config.

Added a regression test with a bare repo named without the .git suffix to lock in the fix.

opencode-agent Bot added a commit that referenced this pull request Apr 22, 2026
opencode-agent Bot added a commit that referenced this pull request Apr 22, 2026
opencode-agent Bot added a commit that referenced this pull request Apr 22, 2026
opencode-agent Bot added a commit that referenced this pull request Apr 22, 2026
opencode-agent Bot added a commit that referenced this pull request Apr 22, 2026
opencode-agent Bot added a commit that referenced this pull request Apr 22, 2026
opencode-agent Bot added a commit that referenced this pull request Apr 22, 2026
opencode-agent Bot added a commit that referenced this pull request Apr 22, 2026
opencode-agent Bot added a commit that referenced this pull request Apr 22, 2026
opencode-agent Bot added a commit that referenced this pull request Apr 22, 2026
@jlongster jlongster merged commit a7fafe4 into anomalyco:dev Apr 22, 2026
8 checks passed
xywsxp pushed a commit to xywsxp/opencode that referenced this pull request Apr 24, 2026
balcsida added a commit to balcsida/opencode that referenced this pull request Apr 28, 2026
* refactor(core): migrate MessageV2 internal Cursor to Effect Schema (anomalyco#23763)

* refactor(core): migrate MessageV2 errors to Schema-backed named errors (anomalyco#23764)

* chore: generate

* chore: bump Bun to 1.3.13 (anomalyco#23791)

* fix(app): improve icon override handling in project edit dialog (anomalyco#23768)

* chore: update nix node_modules hashes

* fix: preserve BOM in text tool round-trips (anomalyco#23797)

* chore: generate

* test: fix cross-spawn stderr race on Windows CI (anomalyco#23808)

* chore: generate

* fix: consolidate project avatar source logic (anomalyco#23819)

* fix(tui): fail fast on invalid session startup (anomalyco#23837)

* chore: generate

* fix(session): improve session compaction (anomalyco#23870)

* chore: generate

* fix(project): use git common dir for bare repo project cache (anomalyco#19054)

* docs: add MiMo V2.5 to Go pages (anomalyco#23876)

* chore: generate

* chore: update nix bun version (anomalyco#23881)

* feat: support pull diagnostics in the LSP client (C#, Kotlin, etc) (anomalyco#23771)

* chore: generate

* log session sdk errors (anomalyco#23652)

* fix(beta): PR resolvers/smoke check should typecheck all pacakges (anomalyco#23913)

* tweak: codex model logic (anomalyco#23925)

* refactor: remove redundant pending check from working memo (anomalyco#23929)

* sync release versions for v1.14.21

* zen: hy3 preview

* fix: add keyed prop to Show components for proper reactivity (anomalyco#23935)

* feat(project): add icon_url_override field to projects (anomalyco#23955)

* chore: generate

* chore: add to TEAM_MEMBERS (anomalyco#23975)

* fix(npm): respect npmrc config (anomalyco#24001)

* fix(tui): render all non-synthetic text parts of a user message (anomalyco#24009)

* refactor(session): migrate session domain to Effect Schema (anomalyco#24005)

* chore: generate

* sync release versions for v1.14.22

* fix(npm): respect npmrc for version lookups (anomalyco#24016)

* chore: generate

* refactor(sync): make session events schema-first (anomalyco#24019)

* chore: generate

* docs(schema): mark sync/index.ts migrated with compat-bridge note (anomalyco#24024)

* sync

* refactor(provider): migrate provider domain to Effect Schema (anomalyco#24027)

* refactor(schema): use Schema.Int and consolidate PositiveInt/NonNegativeInt (anomalyco#24029)

* refactor(bus): migrate BusEvent to Effect Schema (anomalyco#24040)

* chore: generate

* refactor(tool): migrate tool framework + all 18 built-in tools to Effect Schema (anomalyco#23244)

* chore: generate

* feat(tui): support builtin protocol for handling context from editors (anomalyco#24034)

* chore: generate

* docs: update effect schema migration tracker (anomalyco#24054)

* refactor(control-plane): migrate workspace DTO schemas (anomalyco#24056)

* chore: generate

* chore: update copilot readme to symlink to an agents md to prevent dumbass agents from touching these files (anomalyco#24057)

* fix: account for additional openai retry case (anomalyco#24063)

* feat(httpapi): bridge workspace read endpoints (anomalyco#24062)

* feat(truncate): allow configuring tool output truncation limits (anomalyco#23770)

Co-authored-by: rgs_ramp <[email protected]>
Co-authored-by: Aiden Cline <[email protected]>

* chore: generate

* ci: add platform-specific bun install flags (anomalyco#23822)

* fix(desktop): avoid relaunching without installing updates (anomalyco#23806)

* chore: generate

* feat(prompt): add shell mode UI with cancel button, custom icon, and example placeholder (anomalyco#24105)

* sync

* zen: deepseek v4 pro

* fix(app): conditionally show model variant selector (anomalyco#24115)

* test(prompt): align shell placeholder expectation (anomalyco#24147)

* fix: deepseek variants (anomalyco#24157)

* fix: preserve empty reasoning_content for DeepSeek V4 thinking mode (anomalyco#24146)

Co-authored-by: Simon Klee <[email protected]>

* fix: support `max` for deepseek (anomalyco#24163)

* feat(httpapi): bridge file read endpoints (anomalyco#24098)

* sync release versions for v1.14.23

* feat(httpapi): bridge mcp status endpoint (anomalyco#24100)

* chore: generate

* fix: use existingModel as fallback for interleaved field (anomalyco#24172)

* fix: ensure assistant messages always have reasoning on them for deepseek (anomalyco#24180)

* Use OpenTUI theme detection for initial TUI mode, again (anomalyco#23846)

* chore: update nix node_modules hashes

* zen: deepseek v4 pro

* chore: generate

* sync release versions for v1.14.24

* zen: gpt-5.5

* zen: gpt-5.5

* zen: gpt-5.5

* zen: gpt-5.5

* Refactor HttpApi auth middleware wiring (anomalyco#24168)

* refactor(schema): decode effect schemas directly (anomalyco#24169)

* chore: generate

* Clarify HttpApi migration plan (anomalyco#24211)

* ignore: denounce ai spammer

* chore: generate

* fix: ensure gpt-5.5 compacts at correct context size when using openai oauth (anomalyco#24212)

* fix(opencode): clarify git amend condition to require verifying commit landed (anomalyco#19937)

Co-authored-by: Aiden Cline <[email protected]>
Co-authored-by: Luke Parker <[email protected]>
Co-authored-by: Brendan Allan <[email protected]>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: Shoubhit Dash <[email protected]>

* refactor(ripgrep): migrate result schemas to effect (anomalyco#24213)

* test(httpapi): cover hono bridge middleware (anomalyco#24216)

* chore: generate

* Add Roslyn support for Razor and C# scripts (anomalyco#24228)

* fix: validate beta before pushing (anomalyco#24230)

* chore: generate

* chore: group beta PR logs (anomalyco#24236)

* fix(build): add prettier to devDependencies (anomalyco#23255)

* chore: update nix node_modules hashes

* ci: adjust auto close issue script to use not planned instead of completed (anomalyco#24253)

* Fix shell cwd after login startup (anomalyco#24215)

* tool/lsp: include request details in permission metadata (anomalyco#24139)

* fix permission config order (anomalyco#24222)

* chore: generate

* ci: centralize opentui dependencies in workspace catalog

Use catalog references for @opentui/core, @opentui/solid, and opentui-spinner
across packages to ensure consistent versions and simplify updates.

* core: permission config schema now provides full IntelliSense for all tool permission keys

The permission configuration previously used a generic record type that didn't offer editor completions. Updated the schema to explicitly list all tool permission keys (read, edit, glob, grep, list, bash, task, external_directory, lsp, skill, todowrite, question, webfetch, websearch, codesearch, doom_loop) with proper types, enabling autocomplete when editing permission files.

* sync release versions for v1.14.25

* feat(httpapi): bridge instance read endpoints (anomalyco#24258)

* chore: generate

* refactor: remove lazy cross-spawn runtime (anomalyco#24305)

* refactor: rename shared package to core (anomalyco#24309)

* feat: add startup debug command (anomalyco#24310)

* chore: update nix node_modules hashes

* fix(config): preserve permission order with Effect decode (anomalyco#24308)

* core: consolidate shared infrastructure into core package

Moves effect logging, observability, runtime utilities, flags, installation
version info, and process utilities from opencode to core package. This
enables better code sharing across packages and establishes core as the
single source of truth for foundational utilities.

All internal imports updated to use @opencode-ai/core paths for consistency.

* chore: generate

* chore: update nix node_modules hashes

* ci: adjust review flow (anomalyco#24355)

* core: move Global module to @opencode-ai/core for centralized path management

Move the Global module from packages/opencode/src/global to packages/core/src/global
to provide a unified location for managing XDG directories and application paths.
This eliminates duplicate path definitions across packages and ensures consistent
access to data, config, cache, state, log, and bin directories throughout the codebase.

* feat(httpapi): bridge catalog read endpoints (anomalyco#24353)

* chore: generate

* feat(tui): read Zed editor context from state db (anomalyco#24352)

* feat(httpapi): bridge file search endpoints (anomalyco#24356)

* ci: fix model name

* chore: generate

* core: move cross-spawn-spawner from opencode to core package

Moved the cross-spawn-spawner module from packages/opencode to packages/core
to enable code sharing across the monorepo. This consolidates the process
spawning infrastructure into the core package so other packages can use
cross-platform child process spawning without duplicating the implementation.

Updated all import statements across the codebase to reference the new
location (@opencode-ai/core/effect/cross-spawn-spawner). Removed the
local copy from the opencode package along with its tests.

* core: move cross-spawn-spawner to root and remove unused types

The cross-spawn-spawner module has been moved from src/effect/ to src/
to simplify the core package structure. The src/types.d.ts file which
contained unused type declarations has also been removed. All imports
throughout the codebase have been updated to reflect the new location.

This change reduces the package's internal complexity by flattening the
module hierarchy and removing dead code, making future maintenance easier.

* core: move npm service to core package for shared dependency management

* feat(httpapi): bridge experimental read endpoints (anomalyco#24365)

* chore: generate

* chore: update nix node_modules hashes

* feat(httpapi): bridge worktree read endpoint (anomalyco#24366)

* chore: generate

* feat(tui): show /connect tip when user has no models configured (anomalyco#24014)

* feat(httpapi): bridge instance dispose endpoint (anomalyco#24368)

* chore: generate

* feat(httpapi): bridge worktree mutations (anomalyco#24371)

* chore: generate

* feat(httpapi): bridge config update endpoint (anomalyco#24387)

* feat(httpapi): bridge project git init endpoint (anomalyco#24394)

* chore: generate

* feat(httpapi): bridge project update endpoint (anomalyco#24398)

* feat(httpapi): bridge mcp control endpoints (anomalyco#24403)

* chore: generate

* feat(httpapi): bridge mcp oauth endpoints (anomalyco#24405)

* chore: generate

* feat(httpapi): bridge experimental tool routes (anomalyco#24407)

* chore: generate

* test(provider): avoid plugin dependency install timeout (anomalyco#24416)

* sync

* core: Add User-Agent header to identify client version in HTTP requests

* fix: bump openrouter sdk version to resolve deepseek reasoning issue (bug was in sdk pkg) (anomalyco#24435)

* chore: update nix node_modules hashes

* fix: correct typo in comment (anomalyco#24420)

* feat(httpapi): bridge experimental session list (anomalyco#24478)

* chore: generate

* feat(httpapi): bridge workspace mutations (anomalyco#24483)

* chore: generate

* fix(docs): correct OpenCode Go DeepSeek endpoints (anomalyco#24500)

* ci: update team assignments in github-triage

Update team member assignments in the triage tool:
- Remove thdxr from tui and core teams
- Add simonklee to tui team
- Add kitlangton to core team

* feat(httpapi): bridge sync routes (anomalyco#24484)

* chore: generate

* feat(httpapi): bridge session read routes (anomalyco#24485)

* chore: generate

* feat(httpapi): bridge session lifecycle routes (anomalyco#24486)

* chore: generate

* feat(httpapi): bridge session message mutations (anomalyco#24487)

* chore: generate

* feat(httpapi): bridge remaining session routes (anomalyco#24510)

* chore: generate

* sync

* sync

* chore: generate

* chore: rm empty file

* fix(editor): reject lock files with no workspace match for cwd (anomalyco#24323)

* feat(go): add Go model listing endpoint (anomalyco#24304)

Co-authored-by: Frank <[email protected]>

* upgrade opentui to 0.1.104 (anomalyco#24531)

* chore: update nix node_modules hashes

* sync release versions for v1.14.26

* fix(tui): update toast duration handling to use default value (anomalyco#23395)

Co-authored-by: Aiden Cline <[email protected]>

* tui: remove excessive debug logging from workspace creation flow to reduce terminal output noise

* feat(httpapi): bridge event stream (anomalyco#24518)

* chore: generate

* feat: configurable shell selection + desktop settings UI (anomalyco#20602)

* feat(httpapi): bridge pty routes (anomalyco#24547)

* core: refactor Installation service to use a single consolidated result object

Reorganizes the Installation service implementation by grouping info, method, latest, and upgrade methods into a single result object. This improves code locality and makes the service interface more maintainable. Also adds a clarifying comment explaining why the package manager's resolver is used for version lookups (to ensure registries, mirrors, auth, proxies, and dist-tags match upgrade behavior).

* feat(httpapi): bridge tui routes (anomalyco#24548)

* fix(tui): hide provider checks before onboarding (anomalyco#24551)

* upgrade opentui to 0.1.105 (anomalyco#24555)

* chore: update nix node_modules hashes

* sync release versions for v1.14.27

* go: models endpoint

* Update VOUCHED list

anomalyco#24563 (comment)

* fix: ignore GitHub Actions changelog contributor (anomalyco#24567)

* Refactor npm config handling (anomalyco#24565)

* go: add deepseek icon

* chore: generate

* sync release versions for v1.14.28

* fix: default tool call streaming to false for google vertex (anomalyco#24573)

* sync

* ignore: split up reasoning transforms (anomalyco#24574)

* update Go DeepSeek request estimates for cache pricing changes (anomalyco#24575)

* fix(opencode): agent create generates permissions field with deny ins… (anomalyco#24482)

Co-authored-by: Aiden Cline <[email protected]>
Co-authored-by: Aiden Cline <[email protected]>

* chore: generate

* zen: coupons

* chore: generate

* fix: pass workspace symbol query to experimental LSP tool (anomalyco#24576)

* chore: generate

* update Go DeepSeek flash limits for cache pricing drop (anomalyco#24592)

* docs: fix duplicated word in CLI env var table (anomalyco#24614)

Co-authored-by: Seashore <[email protected]>

* chore: generate

* tweak: make interleaved reasoning_content default to true for openai compat deepseek setups (anomalyco#24630)

* fix(httpapi): mount workspace bridge routes (anomalyco#24626)

* fix(httpapi): accept empty session create body (anomalyco#24640)

* refactor: remove module barrels (anomalyco#24554)

* chore: generate

* fix: ensure toolStreaming is set to off by default when using non anthropic models with anthropic sdk (anomalyco#24642)

* fix(tui): stabilize Zed editor context polling (anomalyco#24656)

* chore: generate

* fix(httpapi): enforce instance route parity (anomalyco#24660)

* feat(core): file context improvements and option to disable (anomalyco#24661)

* fix(tui): preserve Zed context on terminal focus (anomalyco#24662)

* test(httpapi): verify reflected route mounts (anomalyco#24663)

* chore: generate

* fix(tui): consume Enter in dialog useKeyboard handlers (anomalyco#23390)

* fix(session): harden shell cancellation (anomalyco#24553)

* test(httpapi): cover full OpenAPI route inventory (anomalyco#24667)

* chore: generate

* fix(httpapi): preserve optional session fields (anomalyco#24671)

* fix(session): omit undefined optional fields (anomalyco#24676)

* fix(session): remove compaction summary dividers (anomalyco#24677)

* test(httpapi): cover session json parity (anomalyco#24682)

* fix(httpapi): align session boolean query parsing (anomalyco#24693)

* chore: generate

* fix(httpapi): preserve provider oauth authorize parity (anomalyco#24703)

* chore: generate

* chore: bump effect beta (anomalyco#24705)

* chore: update nix node_modules hashes

* fix(tui): keep Zed context polling responsive (anomalyco#24711)

* fix(httpapi): preserve mcp oauth error parity (anomalyco#24706)

* chore: generate

* refactor(app): load sync state through TanStack Query (anomalyco#23792)

* fix: sanitize tools for moonshot (anomalyco#24730)

* chore: generate

* Update VOUCHED list

anomalyco#24732 (comment)

* fix(ui): remove redundant flex overrides in tool components (anomalyco#24749)

* ci: add release-cli workflow

---------

Co-authored-by: Kit Langton <[email protected]>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: Luke Parker <[email protected]>
Co-authored-by: Brendan Allan <[email protected]>
Co-authored-by: Shoubhit Dash <[email protected]>
Co-authored-by: Steven T. Cramer <[email protected]>
Co-authored-by: Jack <[email protected]>
Co-authored-by: Caleb Norton <[email protected]>
Co-authored-by: Aiden Cline <[email protected]>
Co-authored-by: opencode <[email protected]>
Co-authored-by: Frank <[email protected]>
Co-authored-by: Simon Klee <[email protected]>
Co-authored-by: James Long <[email protected]>
Co-authored-by: rahul <[email protected]>
Co-authored-by: rgs_ramp <[email protected]>
Co-authored-by: 黑墨水鱼 <[email protected]>
Co-authored-by: 07akioni <[email protected]>
Co-authored-by: Sebastian <[email protected]>
Co-authored-by: Kyle Altendorf <[email protected]>
Co-authored-by: Maddison Hellstrom <[email protected]>
Co-authored-by: Dax <[email protected]>
Co-authored-by: Dax Raad <[email protected]>
Co-authored-by: Aiden Cline <[email protected]>
Co-authored-by: Ariane Emory <[email protected]>
Co-authored-by: Jermiah Joseph <[email protected]>
Co-authored-by: OpeOginni <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: 21pounder <[email protected]>
Co-authored-by: Seashore Shi <[email protected]>
Co-authored-by: Seashore <[email protected]>
Co-authored-by: Cas <[email protected]>
@StevenTCramer StevenTCramer deleted the Cramer/2026-03-25/bare-repo-bug branch May 6, 2026 05:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: project_id cache collision across bare repos under shared parent directory

2 participants