跳转到内容

迁移或恢复项目记忆

opencode-mem 按项目身份的哈希为项目分片建立键。移动 仓库(操作系统迁移、路径重组、从 Windows 挂载切换到 原生路径)因此可能使旧分片在 ~/.opencode-mem/data/projects/ 下成为孤立,同时为新路径创建新的空分片。

这些是带有 JSON 参数的 OpenCode memory 工具调用,而非在 终端中运行的命令。Issue 风格的 memory migrate --from ... 记法对应 memory({ mode: "migrate", fromPath: "..." })。

1. 你仍知道旧路径时的本地移动

在新项目目录中打开 OpenCode。目标项目不得 已包含记忆(冲突时迁移会中止且保持不变)。在更改任何内容之前预览 检测到的源、目标与文件操作:

memory({ mode: "migrate", fromPath: "/old/path/to/project", dryRun: true });
memory({ mode: "migrate", fromPath: "/old/path/to/project" });

为安全起见,若源的已存储项目目录仍然存在,迁移会拒绝。若你有意移动活动源,请先检查 dry-run 输出,然后传入 allowLinkedSource: true。原始源分片 文件会保留为带时间戳的 *.pre-path-migrate-*.bak 备份。

2. 旧路径已消失 — 先发现孤立分片

memory({ mode: "list-shards" });
memory({ mode: "migrate", fromHash: "fa645294d88bbae2" });

list-shards 报告每个项目哈希、已存储的 projectPath、记忆数量, 以及状态(current、linked、orphaned、missing-file、empty 或 ambiguous)。fromHash 是此调用返回的 16 字符小写十六进制 scopeHash。 当旧目录不再存在或 多个分片包含相同已存储路径时优先使用它,因为基于 git 的身份 并不总能从缺失路径重新计算。

3. 跨机器备份 / 恢复

// on the source machine / old checkout
memory({ mode: "export", outputPath: "./memories.json" });
// on the destination machine / new checkout
memory({ mode: "import", inputPath: "./memories.json", dryRun: true });
memory({ mode: "import", inputPath: "./memories.json" });

导出写入不含向量的版本化 JSON 文档。导入会将 记忆重新映射到当前项目,并用当前配置的模型重新计算嵌入。导入会向现有项目添加记忆,但重复的 记忆 ID 会在写入前中止整个导入;这与 migrate 不同, 后者要求目标为空。

导出文件是明文的,可能包含记忆内容、用户名/电子 邮件地址、仓库 URL 与绝对项目路径。请像对待其他 敏感备份一样存储它们,并在不再需要时删除。完全私有的条目 会被省略,且不包含用户画像与提示历史。该 文档包含 schemaVersion: 1;导入会拒绝较新的不支持 schema 版本,而非猜测。