为什么要迁移会话最近我在参与一个挑战杯项目用 Claude Code 做主力辅助开发。经过几轮深入对话此时大量有价值的上下文已经固化在会话里。然而项目中途需要换到另一台电脑继续单纯复制项目文件显然不够新电脑的 Claude Code 不认识之前的对话一切得重头再来。能不能把完整会话上下文也一并迁移实现无缝衔接答案是肯定的。Claude Code 的数据存储设计天然支持可移植性只需几步操作即可。二、先搞懂 Claude Code 把数据存哪了要进行迁移必须知己知彼。Claude Code 的所有本地数据都集中在~/.claude/目录下核心结构如下~/.claude/ ├── projects/ ← 最重要按项目目录存放对话记录 │ └── 编码后的项目路径/ │ ├── session-id.jsonl ← 完整对话转录文件核心数据 │ └── memory/ ← 持久化记忆/memory 命令保存的内容 │ ├── sessions/ ← 会话元数据pid、cwd、状态等 │ └── pid.json │ ├── file-history/ ← 文件编辑历史用于 /diff 等 │ └── session-id/ │ └── *v2 │ ├── tasks/ ← 任务追踪内部状态 │ └── session-id/ │ ├── .highwatermark │ └── .lock │ ├── settings.json ← 用户全局设置 └── settings.local.json ← 本地权限配置其中最关键的是projects/编码路径/session-id.jsonl——它记录了所有对话消息是上下文恢复的命脉。sessions/pid.json则记录了会话的工作目录cwd和会话 ID用于关联。路径编码规则非常重要Claude Code 会对项目绝对路径进行编码作为projects/下的子目录名。规则很简单:→-\→-非 ASCII 字符如中文→-每个字符一个-其他保留关键点如果两台电脑的用户名不同编码目录名就不同迁移时需要做目录重映射。三、两种迁移方案方案 A相同路径最简单如果你能在新电脑上完全复刻旧电脑的项目路径包括盘符、用户名、文件夹名那么迁移只需两步复制项目文件夹到新电脑的相同位置。打包整个~/.claude/复制到新电脑的相同位置覆盖或合并。然后在新电脑的项目目录下启动claude一切就绪。优点无需任何修改操作简单。缺点实际场景中两台电脑用户名不同或盘符不同很常见此时路径无法完全一致。方案 B路径不同通用方案当新电脑用户名、盘符或父目录发生变化时需要额外处理目录重命名和cwd修正。下面结合我的实战案例详细说明。实战场景旧电脑路径C:\Users\A\Desktop\挑战杯数据集用户名A新电脑路径C:\Users\B\Desktop\挑战杯数据集用户名BSession ID66762821-XXXX-XXXX-XXXX-XXXXXXXXXXXX示例占位符PID1111任意命名想要快速找到某一个项目的Session ID直接打开~\.claude\history.jsonl再CtrlF查找该项目的目录路径即可看到对应的ID字段。迁移包结构claude-migration/ ├── README.md ├── projects/ │ └── OLD_ENCODED/ # 旧编码名C--Users-A-Desktop------- │ ├── 66762821-XXXX-....jsonl # 对话转录 │ └── memory/ # 持久化记忆可能为空 ├── sessions/ │ └── 1111.json # 会话元数据需要我们自己手动创建 ├── file-history/ │ └── SESSION_ID/ # 文件编辑历史 │ └── *v2 └── tasks/ └── SESSION_ID/ # 任务追踪数据 ├── .highwatermark └── .lock说明下文所有命令和示例中的A、B、66762821-XXXX-XXXX-XXXX-XXXXXXXXXXXX、1111均为占位符实际操作时请替换为你自己的真实值。四、迁移执行步骤新电脑上操作第 1 步安装并初始化 Claude Code在新电脑上安装 Claude Code并至少运行一次任意目录让它自动生成~/.claude/骨架。claude # 进入后输入 /exit 退出第 2 步计算新路径的编码名用 Python 脚本计算新项目路径的编码名将路径中的B换成你的实际用户名python -c import os new_path rC:\Users\B\Desktop\挑战杯数据集 # 改成你的实际路径 result [] for c in new_path: if c : or c \\ or c in /*?\| or ord(c) 127: result.append(-) else: result.append(c) print(新编码名:, .join(result)) 输出示例新编码名: C--Users-B-Desktop-------。记下这个字符串。第 3 步迁移对话转录核心将迁移包中的projects/OLD_ENCODED/下的.jsonl文件复制到新电脑的~/.claude/projects/新编码名/目录下。mkdir -p ~/.claude/projects/新编码名/ cp /path/to/claude-migration/projects/OLD_ENCODED/66762821-XXXX-XXXX-XXXX-XXXXXXXXXXXX.jsonl \ ~/.claude/projects/新编码名/如果memory/目录不为空也一并复制本例为空可跳过。第 4 步迁移会话元数据并修正 cwdmkdir -p ~/.claude/sessions/