stablyai/orca · warning · Error
Worktree is no longer registered with Git and its directory
Error message
Worktree is no longer registered with Git and its directory is already gone.
What it means
Thrown (UNREGISTERED_MISSING_WORKTREE_MESSAGE) when isAlreadyRemovedWorktreePath is true (directory already gone) but args.force is false AND removedMeta is undefined. Without persisted metadata proving Orca owned the row, the main process won't clear Orca-only state for an unregistered, already-deleted path; it requires the renderer recovery path.
Source
Thrown at src/main/ipc/worktrees.ts:2597
localWorktreeGitOptions
)
runtime.clearOptimisticReconcileToken(args.worktreeId)
removeWorktreeMetadataAndTransientState(store, args.worktreeId, removalHostId)
preservedBranchCleanupByScope.delete(
preservedBranchCleanupScopeKey({
worktreeId: args.worktreeId,
hostId: removalHostId
})
)
invalidateAuthorizedRootsCache()
notifyWorktreesChanged(mainWindow, repoId)
return {}
}
}
if (await isAlreadyRemovedWorktreePath(repo, worktreePath, localWorktreeGitOptions)) {
if (!args.force && !removedMeta) {
// Why: without persisted metadata, require the renderer recovery path before deleting Orca-only state for an unregistered path.
throw new Error(UNREGISTERED_MISSING_WORKTREE_MESSAGE)
}
// Why: a manually deleted worktree is already gone; persisted metadata proves it was an Orca-known row, so no force is needed.
if (repo.connectionId) {
await cleanupUnusedWorktreePushTargetRemoteSsh(
provider!,
repo.path,
args.worktreeId,
removedPushTarget,
store
)
} else {
await cleanupUnusedWorktreePushTargetRemote(
repo.path,
args.worktreeId,
removedPushTarget,
store,
localWorktreeGitOptions
)View on GitHub (pinned to 1136503c6a)
Solutions
- Retry with args.force true so Orca clears the dangling state even without metadata.
- If the worktree was never Orca-tracked, no removal is needed — drop the stale renderer row locally.
- Ensure worktree metadata is persisted at creation so future removals have removedMeta to rely on.
Example fix
// before
invoke('worktrees:remove', { worktreeId, force: false })
// after
invoke('worktrees:remove', { worktreeId, force: true }) Defensive patterns
Strategy: retry
Type guard
function isUnregisteredMissingMessage(e: unknown): boolean {
return e instanceof Error && e.message.startsWith('Worktree is no longer registered with Git and its directory is already gone')
} Try / catch
try {
await invoke('worktrees:remove', { worktreeId, force: false })
} catch (e) {
if (isUnregisteredMissingMessage(e)) {
// No metadata + already gone: clear dangling Orca state with force.
await invoke('worktrees:remove', { worktreeId, force: true })
} else throw e
} Prevention
- Persist worktree metadata at creation so removals have removedMeta.
- Drop stale renderer rows for never-tracked worktrees instead of removing.
- Use force to clear dangling state when metadata is absent.
When it happens
Trigger: A non-force worktrees:remove for a worktree whose directory is already gone and for which the store holds no WorktreeMeta (never persisted, or metadata was wiped).
Common situations: User deleted the worktree directory out-of-band and the Orca metadata row was never written or was cleared; the path is gone but Orca can't prove prior ownership.
Related errors
- Worktree is no longer registered with Git but its directory
- SSH filesystem provider unavailable
- SSH filesystem provider lstat unavailable
- Refusing to delete unregistered worktree path: ${worktreePat
- Failed to force delete worktree at ${canonicalWorktreePath}.
AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12).
Data as JSON: /api/errors/515c3f7d1ffffe9a.
Report an issue: GitHub.