{"record":{"id":"70dbd62a6bb0e8bd","repo":"gitbutlerapp/gitbutler","slug":"no-workdir-found-for-repository","errorCode":null,"errorMessage":"no workdir found for repository","messagePattern":"no workdir found for repository","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/gitbutler-project/src/project.rs","lineNumber":329,"sourceCode":"        }\n    }\n\n    /// Try to get the `Project`, returning an error if it was not added.\n    pub fn try_project(self) -> anyhow::Result<Project> {\n        match self {\n            AddProjectOutcome::Added(p) => Ok(p),\n            AddProjectOutcome::AlreadyExists(_) => Err(anyhow::anyhow!(\"project already exists\")),\n            AddProjectOutcome::PathNotFound => Err(anyhow::anyhow!(\"project path not found\")),\n            AddProjectOutcome::NotADirectory => {\n                Err(anyhow::anyhow!(\"project path is not a directory\"))\n            }\n            AddProjectOutcome::BareRepository => {\n                Err(anyhow::anyhow!(\"bare repositories are not supported\"))\n            }\n            AddProjectOutcome::NonMainWorktree => {\n                Err(anyhow::anyhow!(\"non-main worktrees are not supported\"))\n            }\n            AddProjectOutcome::NoWorkdir => Err(anyhow::anyhow!(\"no workdir found for repository\")),\n            AddProjectOutcome::NoDotGitDirectory => {\n                Err(anyhow::anyhow!(\"no .git directory found in repository\"))\n            }\n            AddProjectOutcome::ReftableRefFormatUnsupported => Err(anyhow::anyhow!(\n                \"unsupported repository reference format: reftable\"\n            )),\n            AddProjectOutcome::NotAGitRepository(msg) => {\n                Err(anyhow::anyhow!(\"not a git repository: {msg}\"))\n            }\n        }\n    }\n}\n","sourceCodeStart":311,"sourceCodeEnd":342,"githubUrl":"https://github.com/gitbutlerapp/gitbutler/blob/caf1f223d3cfb94488c9198ad34487c6006c648f/crates/gitbutler-project/src/project.rs#L311-L342","documentation":"AddProjectOutcome::NoWorkdir mapped through try_project: a git repository was detected but git reports no working directory for it (gix could not resolve a work_dir). Distinct from BareRepository — this happens when the repository layout is unusual (e.g. detached GIT_DIR setups, GIT_WORK_TREE not set where needed) so no workdir path can be determined.","triggerScenarios":"add_project where the repo was opened with only a gitdir (GIT_DIR set, no work tree); unusual layouts like .git files pointing to relocated gitdirs without a worktree config; repos on filesystems where the workdir lookup fails.","commonSituations":"Environments exporting GIT_DIR/GIT_WORK_TREE inconsistently; repos managed by wrappers that move .git elsewhere; edge-case repository layouts produced by other tools.","solutions":["Onboard a standard clone where the worktree and .git sit together","Unset GIT_DIR/GIT_WORK_TREE overrides when invoking the app so the repository layout resolves normally","Inspect the repo with `git rev-parse --git-dir --show-toplevel` — if show-toplevel is empty, the layout is the problem"],"exampleFix":"// before\nlet project = add_project(&path, ...).try_project()?; // 'no workdir found'\n\n// after: verify the repo reports a workdir before onboarding\nlet out = std::process::Command::new(\"git\")\n    .args([\"-C\", path.to_str().unwrap(), \"rev-parse\", \"--show-toplevel\"])\n    .output()?;\nif out.stdout.is_empty() {\n    anyhow::bail!(\"repository at {} has no workdir — use a standard clone\", path.display());\n}\nlet project = add_project(&path, ...).try_project()?;","handlingStrategy":"validation","validationCode":"let out = std::process::Command::new(\"git\")\n    .args([\"-C\", &path.to_string_lossy(), \"rev-parse\", \"--show-toplevel\"])\n    .output()?;\nif !out.status.success() || out.stdout.trim().is_empty() {\n    anyhow::bail!(\"repository reports no workdir — use a standard clone\");\n}","typeGuard":null,"tryCatchPattern":"match add_project(&path, ...) {\n    AddProjectOutcome::NoWorkdir => suggest_standard_clone(&path),\n    outcome => outcome.try_project(),\n}","preventionTips":["Do not onboard repositories discovered through GIT_DIR-only setups; unset overrides first","Verify `git rev-parse --show-toplevel` returns a path for candidate directories","Keep repository layouts conventional (worktree root containing .git) for tool compatibility"],"tags":["gitbutler","project","git","worktree","validation"],"backgroundTag":"repository-workdir-missing","analyzedSha":"caf1f223d3cfb94488c9198ad34487c6006c648f","analyzedAt":"2026-08-20T07:55:40.983Z","schemaVersion":2},"datasetVersion":"2026-08-23T16:17:53.355Z"}