paperclipai/paperclip · error · Error

Failed to compute a merged git tree for workspace restore.

Error message

Failed to compute a merged git tree for workspace restore.

What it means

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.

Source

Thrown at packages/adapter-utils/src/git-workspace-sync.ts:432

        throw error;
      }
    }

    let mergedTree;
    try {
      mergedTree = await runLocalGit(input.localDir, ["merge-tree", "--write-tree", currentHead, input.importedHead], {
        timeout: 60_000,
        maxBuffer: 256 * 1024,
      });
    } catch (error) {
      const reason = error instanceof Error ? error.message : String(error);
      throw new Error(
        `Failed to merge concurrent remote git histories for ${currentHead.slice(0, 12)} and ${input.importedHead.slice(0, 12)}: ${reason}`,
      );
    }
    const mergedTreeId = mergedTree.stdout.trim().split("\n")[0]?.trim() ?? "";
    if (!mergedTreeId) {
      throw new Error("Failed to compute a merged git tree for workspace restore.");
    }

    const mergeCommit = await runLocalGit(
      input.localDir,
      [
        "commit-tree",
        mergedTreeId,
        "-p",
        currentHead,
        "-p",
        input.importedHead,
        "-m",
        `Paperclip remote git sync merge ${input.importedHead.slice(0, 12)}`,
      ],
      {
        timeout: 60_000,
        maxBuffer: 64 * 1024,
      },

View on GitHub (pinned to 67001ec6eb)

Solutions

  1. Check the git version installed locally — `merge-tree --write-tree` output format may differ in newer/older versions.
  2. Run `git merge-tree --write-tree <head1> <head2>` manually in the localDir to inspect the actual output.
  3. If the issue persists, file a bug with the git output and version information.
Defensive patterns

Strategy: try-catch

Try / catch

try {
  await integrateImportedGitHead({ localDir, importedHead });
} catch (err) {
  if (err instanceof Error && err.message.includes("Failed to compute a merged git tree")) {
    // Unexpected git output — check git version and output format
    const version = await runLocalGit(localDir, ["--version"], { timeout: 5_000, maxBuffer: 1024 });
    logger.error(`Unexpected merge-tree output. Git version: ${version.stdout.trim()}`);
  }
  throw err;
}

Prevention

When it happens

Trigger: Calling integrateImportedGitHead where runLocalGit for `merge-tree --write-tree` resolves without error, but mergedTree.stdout.trim().split('\n')[0] is empty.

Common situations: 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.

Related errors


AI-assisted analysis of paperclipai/paperclip@67001ec6eb (2026-08-12). Data as JSON: /api/errors/e2a94f23292f3b1e. Report an issue: GitHub.