Repository navigation
[BUG]: Project ID collision when repos cloned from same source share sessions #6696
Description
Repos cloned from the same source share the same root commit hash, causing them to share sessions unexpectedly. Opening opencode in either repo shows sessions from both.
Affected workflows
- Cloned templates (e.g.,
create-react-app, Next.js starters) - Forks
- Any "clone and change origin" workflow
Reproduction
#!/bin/bash
set -e
WORKDIR=$(mktemp -d)
cd "$WORKDIR"
# Create template repo and clone it twice
mkdir template && cd template
git init -q && echo "template" > README.md && git add . && git commit -qm "init"
cd "$WORKDIR"
git clone -q template clone-a
git clone -q template clone-b
# Run opencode in each
(cd "$WORKDIR/clone-a" && opencode run "respond with only: session from clone-a")
(cd "$WORKDIR/clone-b" && opencode run "respond with only: session from clone-b")
# Verify collision
echo "clone-a project ID: $(cat "$WORKDIR/clone-a/.git/opencode")"
echo "clone-b project ID: $(cat "$WORKDIR/clone-b/.git/opencode")"
# Both are identical - opening opencode in either shows sessions from bothRoot cause
Project ID is derived from the first root commit hash:
opencode/packages/opencode/src/project/project.ts
Lines 57 to 72 in 038cff4
| if (!id) { | |
| const roots = await $`git rev-list --max-parents=0 --all` | |
| .quiet() | |
| .nothrow() | |
| .cwd(worktree) | |
| .text() | |
| .then((x) => | |
| x | |
| .split("\n") | |
| .filter(Boolean) | |
| .map((x) => x.trim()) | |
| .toSorted(), | |
| ) | |
| id = roots[0] | |
| if (id) Bun.file(path.join(git, "opencode")).write(id) | |
| } |
Related
- Desktop app: opening multiple git worktrees from the same repo replaces existing project #5638 - Same root cause but for git worktrees. PR fix: desktop app worktree collision - use separate ID per worktree #5647 fixes worktrees by adding worktree hash, but cloned repos aren't worktrees so they still collide.
Notes on solution
The fix probably needs to be conditional:
- Worktree → Share project ID with main repo (current behavior is correct for this case)
- Git repo (not worktree) → Need deterministic unique ID that doesn't collide across clones. Root commit alone isn't sufficient. Options: include absolute path in hash, or remote origin URL, or generate UUID on first run.
- Not a git repo → Could use absolute path
Key insight: PR #5647 correctly handles worktrees. This issue is specifically about the non-worktree clone scenario.
Side note: worktree caching
In git worktrees, .git is a file (not directory) pointing to .git/worktrees/<name>/. The current cache write to .git/opencode fails silently. Depending on the solution chosen here, this silent failure may cause issues if the fix relies on persisting something to that file.
opencode/packages/opencode/src/project/project.ts
Lines 53 to 56 in 038cff4
| let id = await Bun.file(path.join(git, "opencode")) | |
| .text() | |
| .then((x) => x.trim()) | |
| .catch(() => {}) |
Activity
github-actions commentedon Jan 2, 2026
This issue might be a duplicate of existing issues. Please check:
Feel free to ignore if none of these address your specific case.
[-]Project ID collision when repos cloned from same source share sessions[/-][+][BUG]: Project ID collision when repos cloned from same source share sessions[/+]rekram1-node commentedon Jan 2, 2026
For worktree stuff did u see the lines of code underneath that? We handle the case that it fails?
bcheung commentedon Jan 3, 2026
the issue is worktree/.git is a file rather than a folder so the next bit of logic that tries to write the project id also fails silently cause there's no promise handling:
opencode/packages/opencode/src/project/project.ts
Line 71 in 038cff4
this is one line repro script that will emulate what is going on:
Think what you are looking for is to check and write to
/path/to/project/.git/worktrees/my-worktree/opencodecolinmollenhour commentedon Jan 29, 2026
Would that explain this bug where the pwd of my session doesn't match the project I selected? It affects the Web mode, but not the TUI.
rachidbch commentedon Feb 1, 2026
I don't delete the "issue" below (below the ***) because it may help another new comer to opencode.
But the "quick fix" is pretty simple, you just have to use opencode session management to create a (at least) a session by worktree.
*** > Original reported problem
For me I have a /main/repo/ and created a git worktree in /wortree/repo/ to work in parallel on both with opencode, but both folders share the same opencode conversation, which defeats the use of worktrees for parallel work...
Am I doing something wrong (I'm new to opencode, had no problem on this with claude-code) ?
Does anyone has a quick fix to force opencode to use two separate conversations (or sessions as I presume a conversation is attached to a session) ?
Environment: WSL2/Windows11, opencode version 1.1.48
colinmollenhour commentedon Feb 1, 2026
As far as I know there is not a way to change the pwd of a TUI session, although I do think that would be useful. E.g. to be able to say "Read these plans, create a worktree, make that worktree the active pwd and implement the plans" from inside a TUI session. Is that what you mean?
fix: resolve unique project IDs for git submodules
github-actions commentedon Apr 3, 2026
To stay organized issues are automatically closed after 90 days of no activity. If the issue is still relevant please open a new one.
Hona commentedon Sep 2, 2026
Fixed for opencode2 launch via #46713
You can try the desktop beta here: https://github.com/anomalyco/opencode-beta