Claude会话同步
Claude Desktop 一条 Code 会话的数据分散在好几个地方:正文、侧边栏记录、归档清单、删除墓碑、worktree。数据目录还会按登录方式分成两套,商店版又被 Windows 重定向了一次。搞清楚这些,切换账号后会话「消失」、报 Git 错、在资源管理器里找不到目录,就都能解释了。
我在说什么!我很难组织好,这篇有点烂我也发出来吧,太小众了,不想改了,如果你遇到了这个问题,想迁移,直接下载 skill 让 AI 自己来做吧!我就简单说下人能听的
当你切换登录方式之后,侧边栏里原来的 Code 会话全不见了。可聊过的内容明明都存在本地,侧边栏为什么就没有这些会话记录了呢?要回答这个问题,得先看清楚一条会话到底存在哪些地方。
会话存储位置
| 部分 | 位置 | 存的是什么 |
|---|---|---|
| 会话正文 | %USERPROFILE%\.claude\projects\<项目路径>\<cliSessionId>.jsonl | 每一轮对话、每一次工具调用,一行一个事件 |
| 侧边栏记录 | <数据目录>\claude-code-sessions\<账号ID>\<组织ID>\local_<会话ID>.json | 标题、工作目录、分支、模型、权限模式,以及对应正文的 cliSessionId |
| 归档清单 | 同一文件夹的 archived-sessions.idx | 哪些会话被归档了 |
| 删除墓碑 | 同一文件夹的 deleted_<会话ID> | 这条会话被删过,内容只是一个毫秒时间戳 |
| worktree 注册表 | <数据目录>\git-worktrees.json | Desktop 认为有哪些 worktree、分别归哪条会话用 |
| worktree 本身 | <仓库>\.claude\worktrees\<名字>,分支 claude/<名字> | 每条 Code 会话在自己的工作副本里改代码 |
正文和侧边栏记录是分开存的,而且存在完全不同的地方,到时候迁移都需要
正文:所有模式共用一份
正文在用户目录下的 .claude\projects\ 里,和 Claude Code 命令行用的是同一个位置。每个项目一个文件夹,文件夹名由项目路径转出来:盘符、斜杠、点以及所有不是字母数字的字符都换成 -,比如 C:\Users\me\Desktop\blog.detached.online 变成 C--Users-me-Desktop-blog-detached-online。中文也一样被换掉,所以中文名的项目文件夹会变成一串横杠,几个同样长度的中文目录名甚至会撞到一起。
文件夹里每条会话一个 <cliSessionId>.jsonl,这份正文不分登录方式、不分安装方式,也不进 Desktop 的数据目录。所以无论侧边栏怎么变,聊过的内容都还在,要找回的只是侧边栏那份记录。
侧边栏记录:按登录方式分两套
Desktop 的数据目录(Electron 的 userData)是按登录方式选的,这是写死在程序里的:
| 第三方 provider(公司网关、Bedrock、Vertex 等) | 官方账号(claude.ai) | |
|---|---|---|
| 数据目录 | %LOCALAPPDATA%\Claude-3p | %APPDATA%\Claude |
<组织ID> 那一层 | 固定值 00000000-0000-4000-8000-000000000001 | 真实的组织 ID |
设了环境变量 CLAUDE_USER_DATA_DIR 的话,以它为准。
两套目录各有一份 claude-code-sessions,侧边栏只显示当前这一套里的记录。所以切换登录方式等于换了一个文件夹,侧边栏自然是空的。开头那个问题的答案就在这里:丢的只是侧边栏的索引,正文一条没丢。
local_<会话ID>.json 里记的是会话自己的状态,不含账号 ID 和组织 ID(我在两台机器上都核对过),身份只体现在它放在哪个文件夹里。这意味着把一条记录原样复制到另一套目录的对应文件夹,Desktop 就会认它。
但复制只是快照,不是同步。之后两边各自往前走,同一条会话在两边都用的话会分叉:我就有一条,一边聊了 47 轮,另一边 31 轮,谁也不是谁的超集。
归档清单和删除墓碑要另外小心。它们记的是状态,不是数据:两边的归档清单一边 2 条、一边 15 条,拿一份盖掉另一份,会平白多归档或者放出 13 条会话;目标那边有删除墓碑的,光复制记录可能不生效。
另外,Desktop 开着的时候会不断改写这些文件,在它运行时复制进去的东西,退出时会被它内存里的旧状态盖掉。要改,得先从托盘彻底退出。
Claude商店版
如果 Claude 是从微软商店装的,你在资源管理器里打开 %APPDATA%\Claude 会发现它不存在。
商店版是 MSIX 打包的应用,它往 %APPDATA% 里写的东西会被 Windows 重定向到它自己的包目录:
%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude在 Claude 自己看来,路径仍然是 %APPDATA%\Claude,读写都正常;可你在资源管理器或者普通终端里去找,那个路径是空的。我这台电脑是商店版,官方账号那一百多条会话记录就在上面这个位置。从官网下载安装包装的版本没有这层重定向,就在 %APPDATA%\Claude。
worktree需要同步
Code 会话的 worktree 由三个地方共同记录:git 自己(<仓库>\.git\worktrees\)、Desktop 的 git-worktrees.json、以及会话记录里写的目录和分支。git 有一条硬规定:同一个分支不能同时被两个 worktree 检出。
所以只要会话记录里写的目录不存在,而它要的分支又正被别的目录占着,Desktop 想重建 worktree 就会被 git 拒绝,报:
Git isn’t working: this session’s branch is checked out somewhere else in this repository
会话记录的字段名也会随版本变:旧版本(2.2553.1)用 worktreePath 和 worktreeName 记目录,新版本(2.37337.1)改成了 cwd 配 originCwd。照着别人的命令去改之前,先打出一条记录看看字段名。
| 现象 | 原因 |
|---|---|
| 切换登录方式后侧边栏空了 | 两种登录方式各用一套数据目录,侧边栏只读当前那套 |
| 把记录复制过去就能找回 | 记录里不含账号和组织 ID,可以原样复制 |
| branch is checked out somewhere else | 会话、Desktop、git 三处对 worktree 的记录对不上 |
怎么修复
切换账号后怎么找回会话、Git 报错怎么修,直接下载丢给他让他来帮你修复吧·
| 下载 | 说明 |
|---|---|
| SKILL.md(英文版) | 给 AI 用,建议用这个 |
| SKILL.cn.md(中文版) | 内容相同,方便自己看 |
评论
评论加载中……