{"record":{"id":"e2a94f23292f3b1e","repo":"paperclipai/paperclip","slug":"failed-to-compute-a-merged-git-tree-for-workspace","errorCode":null,"errorMessage":"Failed to compute a merged git tree for workspace restore.","messagePattern":"Failed to compute a merged git tree for workspace restore\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/adapter-utils/src/git-workspace-sync.ts","lineNumber":432,"sourceCode":"        throw error;\n      }\n    }\n\n    let mergedTree;\n    try {\n      mergedTree = await runLocalGit(input.localDir, [\"merge-tree\", \"--write-tree\", currentHead, input.importedHead], {\n        timeout: 60_000,\n        maxBuffer: 256 * 1024,\n      });\n    } catch (error) {\n      const reason = error instanceof Error ? error.message : String(error);\n      throw new Error(\n        `Failed to merge concurrent remote git histories for ${currentHead.slice(0, 12)} and ${input.importedHead.slice(0, 12)}: ${reason}`,\n      );\n    }\n    const mergedTreeId = mergedTree.stdout.trim().split(\"\\n\")[0]?.trim() ?? \"\";\n    if (!mergedTreeId) {\n      throw new Error(\"Failed to compute a merged git tree for workspace restore.\");\n    }\n\n    const mergeCommit = await runLocalGit(\n      input.localDir,\n      [\n        \"commit-tree\",\n        mergedTreeId,\n        \"-p\",\n        currentHead,\n        \"-p\",\n        input.importedHead,\n        \"-m\",\n        `Paperclip remote git sync merge ${input.importedHead.slice(0, 12)}`,\n      ],\n      {\n        timeout: 60_000,\n        maxBuffer: 64 * 1024,\n      },","sourceCodeStart":414,"sourceCodeEnd":450,"githubUrl":"https://github.com/paperclipai/paperclip/blob/67001ec6eb96ae601aa27bc91d9b2415d665334a/packages/adapter-utils/src/git-workspace-sync.ts#L414-L450","documentation":"Thrown by integrateImportedGitHead when `git merge-tree --write-tree` succeeds (no exception) but its stdout is empty, so no merged tree ID can be extracted. This is a defensive guard for an unexpected git output format — under normal operation merge-tree always emits a tree hash on the first line.","triggerScenarios":"Calling integrateImportedGitHead where runLocalGit for `merge-tree --write-tree` resolves without error, but mergedTree.stdout.trim().split('\\n')[0] is empty.","commonSituations":"A future git version changes merge-tree output format; git emitted only informational messages to stdout without the tree hash; an edge-case with identical trees or empty repos produces no output.","solutions":["Check the git version installed locally — `merge-tree --write-tree` output format may differ in newer/older versions.","Run `git merge-tree --write-tree <head1> <head2>` manually in the localDir to inspect the actual output.","If the issue persists, file a bug with the git output and version information."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  await integrateImportedGitHead({ localDir, importedHead });\n} catch (err) {\n  if (err instanceof Error && err.message.includes(\"Failed to compute a merged git tree\")) {\n    // Unexpected git output — check git version and output format\n    const version = await runLocalGit(localDir, [\"--version\"], { timeout: 5_000, maxBuffer: 1024 });\n    logger.error(`Unexpected merge-tree output. Git version: ${version.stdout.trim()}`);\n  }\n  throw err;\n}","preventionTips":["Pin the git version to a known-good release that supports merge-tree --write-tree.","Run integration tests that exercise the merge path with the installed git version."],"tags":["git","workspace-sync","adapter-utils"],"backgroundTag":null,"analyzedSha":"67001ec6eb96ae601aa27bc91d9b2415d665334a","analyzedAt":"2026-08-12T12:05:45.408Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}