告别会话分裂:用环境变量彻底搞定 Claude Code 的多机同步痛点
大家都知道 Claude Code 很好用,但如果你跟我一样,喜欢把它的会话记录放在 Dropbox 里,好让换台 Mac 也能接着上次的对话聊,那你肯定遇到过一个大麻烦:只要你的项目文件夹路径稍微不一样,比如换了一台电脑、或者用了 Git 的 worktree(工作树)功能,Claude Code 就会以为这是一个新项目,然后把它存成一个新的文件夹。结果就是,你的历史记录被拆得七零八落。
为什么会这样?因为 Claude Code 默认会把你的当前文件夹路径里的所有特殊字符换成连字符,直接拿来做文件夹名。你原来的记录可能长这样:
# 默认的文件夹结构,路径不同就会生成一堆乱七八糟的目录
-Users-scenee-Workspace-FloatingPanel/
-Users-scenee-Workspace-blog/
-Users-scenee-Workspace-blog--claude-worktrees-fix/
-Users-scenee-Workspace-blog--agents-worktrees-cover/
-private-tmp-blog-worktrees-hotfix/
你看,后面四个文件夹其实都是同一个博客项目,只是因为放在了不同的路径下,就生成了四个不同的记录目录。要是换台电脑,路径再变变,又会多出几个文件夹,历史记录全乱套了。
一招搞定:自己给项目文件夹起名字
好消息是,我们可以用 CLAUDE_CODE_PROJECT_DIR_NAME 这个环境变量,直接把这个文件夹的名字固定下来。这样一来,不管你在哪个路径下打开项目,Claude Code 都会把记录和自动记忆写到同一个文件夹里。
设置好后,你的文件夹就会变得干干净净:
# 自定义名称后的文件夹结构,所有记录都集中在一个目录下
scenee-blog/
├── 1f9a0c3e-....jsonl # 会话记录1
├── 7c42b8d1-....jsonl # 会话记录2
└── memory/ # 自动记忆文件夹
不过在使用这个环境变量时,有三个铁律必须记住:
- 必须同时设置
CLAUDE_CONFIG_DIR:光设置项目名称没用,你必须顺便把 Claude 的配置目录也指明一下。就算你用的是默认的~/.claude目录,也得明明白白地写出来,不然 Claude Code 会直接无视你设的项目名。 - 名字要守规矩:名字只能是 1 到 64 个字母、数字、下划线或者连字符。要是你用了中文或者空格,它就不认账了,又会退回到按路径生成名字的老路上去。
- 必须在终端环境里设置:Claude Code 启动的时候只会读一次环境变量。你要是在它的配置文件
settings.json里面写,是没有任何效果的。必须在你打开终端的那一层设置好。
让它全自动:使用 direnv 解放双手
上面的第三个铁律最让人头疼。每次进项目前都要手动敲一遍环境变量,太容易忘了;但要是写进全局配置里,所有项目的名字又都一样了,达不到“每个项目一个名字”的目的。
这时候,就轮到 direnv 这个神器出场了。它的作用很简单:当你进入某个文件夹时,它自动帮你加载环境变量;当你离开这个文件夹时,它又自动帮你卸载。
装好 direnv 并跟你的终端挂钩后,在项目根目录建一个 .envrc 文件,写下这些:
# .envrc 文件内容
# 明确指向 Claude 的配置目录
export CLAUDE_CONFIG_DIR=~/.claude
# 给当前项目指定一个固定的名字
export CLAUDE_CODE_PROJECT_DIR_NAME=scenee-blog
小贴士:一定要用 direnv edit . 命令来创建和编辑这个文件。这样做会在你保存时自动运行 direnv allow,免去你手动去解除安全限制的麻烦,不会遇到“.envrc is blocked”的报错。
设置好之后,不管你是从哪个 worktree 打开这个项目,还是换了另一台 Mac 同步下来打开,只要你进入了这个目录,终端就会自动设好这两个变量,Claude Code 就会把记录乖乖写进那个固定的文件夹里。
使用时容易忘的两件小事
- 运行 claude 前开个新终端窗口:
direnv只对进入目录之后的终端生效。所以在启动 Claude Code 前,最好先敲个echo $CLAUDE_CODE_PROJECT_DIR_NAME确认一下变量有没有加载成功。 - 换电脑后要重新信任一次:虽然
.envrc文件提交到了 Git 仓库里,但direnv的信任记录是保存在本地的。所以在新的 Mac 上拉下代码后,需要再跑一次direnv allow才会生效。如果是你自己建的 worktree,里面也会有一份新的.envrc,同样需要direnv allow一下。
总结
搞定这套配置后,不管我在哪台 Mac 上,不管我在哪个分支的 worktree 里,同一个项目的 Claude Code 会话记录都会整整齐齐地放在同一个文件夹下。通过 Dropbox 同步后,随时可以接着上次的对话继续聊,再也不用去一堆乱七八糟的路径文件夹里翻找历史记录了。