Skip to content

[BUG]: Project ID collision when repos cloned from same source share sessions #6696

Closed

Description

@bcheung

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 both

Root cause

Project ID is derived from the first root commit hash:

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

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.

let id = await Bun.file(path.join(git, "opencode"))
.text()
.then((x) => x.trim())
.catch(() => {})

Activity

  1. github-actions commented on Jan 2, 2026

    @github-actions
    Contributor

    This issue might be a duplicate of existing issues. Please check:

    Feel free to ignore if none of these address your specific case.

  2. changed the title [-]Project ID collision when repos cloned from same source share sessions[/-] [+][BUG]: Project ID collision when repos cloned from same source share sessions[/+] on Jan 2, 2026
  3. rekram1-node commented on Jan 2, 2026

    @rekram1-node
    Collaborator

    For worktree stuff did u see the lines of code underneath that? We handle the case that it fails?

  4. bcheung commented on Jan 3, 2026

    @bcheung
    ContributorAuthor

    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:

    if (id) Bun.file(path.join(git, "opencode")).write(id)

    this is one line repro script that will emulate what is going on:

    cd $(mktemp -d) && git init -q main && git -C main commit --allow-empty -qm "init" && git -C main worktree add ../wt -b t -q && echo ".git is a file:" && cat wt/.git && echo "" && echo "Write fails:" && bun -e "await Bun.file('$(pwd)/wt/.git/opencode').write('x')"
    

    Think what you are looking for is to check and write to /path/to/project/.git/worktrees/my-worktree/opencode

  5. colinmollenhour commented on Jan 29, 2026

    @colinmollenhour

    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.

    Image
  6. rachidbch commented on Feb 1, 2026

    @rachidbch

    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

  7. colinmollenhour commented on Feb 1, 2026

    @colinmollenhour

    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?

  8. added a commit that references this issue on Mar 26, 2026
    20d96a4
  9. github-actions commented on Apr 3, 2026

    @github-actions
    Contributor

    To stay organized issues are automatically closed after 90 days of no activity. If the issue is still relevant please open a new one.

  10. Hona commented on Sep 2, 2026

    @Hona
    Member

    Fixed for opencode2 launch via #46713
    You can try the desktop beta here: https://github.com/anomalyco/opencode-beta

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions