三台 Mac,一套 shell,一堆 dotfiles。几年后,最先失控的不是 zsh,也不是 gitconfig,而是那些看起来很聪明的符号链接。

这次迁移很小:作者把多年使用的 GNU Stow 换成 chezmoi。场景也很具体:工作 MacBook Pro、个人 MacBook Air、一台当小服务器的 Mac Mini。Linux VM 不是重点,服务器仍主要靠 Ansible。

我更在意的不是“chezmoi 是否更先进”。真正的分水岭是:当个人开发环境从单机配置变成多设备基础设施,隐式写穿开始不够用了。

Stow 没坏,坏在多设备开始收税

GNU Stow 的模型很朴素:dotfiles 放进 Git repo,再用符号链接挂到 home 目录。

单机时,它很顺。学习成本低,逻辑直接,文件也都在 repo 里。

麻烦从多台机器开始。

问题Stow 下的状态chezmoi 的处理
日常修改home 里的 symlink 会直接写穿到 repohome 里是真实文件,不会自动污染源目录
多机同步Pro、Air、Mini 各有 clone,容易出现脏状态和冲突~/.local/share/chezmoi 是源目录,用 Git 管
新机初始化已有 ~/.zprofile~/.gitconfig 时,常要手动删掉再 stowchezmoi init --apply 拉 repo、写文件、跑脚本
工具安装Brewfile、macOS 设置脚本容易散在流程外脚本和 Brewfile 可纳入同一 apply 流程

Stow 的优点,正好也是风险。

你在任意机器上改一个配置,repo 立刻变脏。改动是有意还是顺手?是这台机器特有,还是要同步到所有机器?时间一长,很难分清。

这不是 Stow 过时。它在单机、简单 dotfiles、低变化场景里仍然成立。

问题是多设备开发者已经不在那个场景里了。

对这类人,最现实的动作不是马上迁移,而是先看两件事:你的 dotfiles repo 是否经常脏;新机器初始化是否还靠记忆。如果答案都是 yes,Stow 的省事已经开始变成债。

chezmoi 的关键:把同步变成显式动作

chezmoi 的做法更慢一点,也更清楚。

源目录放在 ~/.local/share/chezmoi,由 Git 管理。chezmoi apply 把源目录里的配置写到 home。chezmoi diff 看当前机器和源状态的差异。

本机真的改了配置,也不是自动写回源目录。你要用 chezmoi addre-add 明确回收。

这一步很关键。

它把“我随手改了一个文件”变成“我决定把这个改动纳入源”。边界清楚了,冲突也更容易追责。

新 Mac 的初始化也被压短:先装 Homebrew,再 brew install chezmoi,然后执行 chezmoi init --apply。这个命令会拉 repo、写 dotfiles、运行 .chezmoiscripts 里的脚本。

作者还把 Brewfile 放进源目录,用 checksum 判断是否触发 brew bundle。Brewfile 变了,脚本才跑;没变就不折腾。--no-upgrade 也很克制,只补缺包,不顺手升级全家桶。

这比“换了一个 dotfiles 工具”重要。

过去个人开发环境像抽屉:zsh 一处,gitconfig 一处,Homebrew 一处,macOS defaults 一处。每次新机器都靠回忆复原。

chezmoi 做的不是企业级配置管理。也不该被吹成 Ansible 替代品。作者自己的边界很明确:Linux 和服务器主要还是 Ansible。

它适合的是另一类人:多台个人开发机、macOS 为主、dotfiles 很重、又不想把桌面环境做成完整 DevOps 工程。

接下来最该观察的变量也很具体:chezmoi 能不能把更多“个人工具链配置”稳定纳入 apply 流程,而不是只管几个点文件。脚本越多,约束也越多。脚本顺序、幂等性、机器差异,都会重新变成成本。

换句话说,chezmoi 解决的是配置漂移,不是替你消灭复杂性。

AI 编程助手让 dotfiles 的边界变宽了

这次迁移里最有意思的细节,不是 shell。

作者把 Claude Code、Codex 的 agent skills 也纳入 chezmoi 管理。skills 放在 ~/.agents/skills,Codex 默认识别。Claude Code 还看 ~/.claude/skills,于是用 chezmoi 管一个 symlink,把 Claude 指向同一份 skills。

这里有点反讽:离开 Stow,是为了少被符号链接牵着走;最后还是保留了一个符号链接。

但性质不同。

这次的 symlink 不是状态管理的底座,只是适配某个工具的入口。主状态仍由 chezmoi 管。

这说明 dotfiles 已经不只是 shell 配置。它开始包含包管理、系统偏好、CLI 身份、AI 编程助手的行为规则。

个人开发环境正在变成一套小型操作系统。

“天下熙熙,皆为利来。”放到工具链里也不违和。每个新工具都想拥有自己的目录、约定和小生态。Claude 有 Claude 的路径,Codex 有 Codex 的默认识别方式,Homebrew 有 Brewfile,macOS 有 defaults。

用户如果不主动收束,最后就会被工具的目录结构反向管理。

对正在重度使用 AI 编程助手的工程师,这个信号更直接:不要只同步 prompt 和命令习惯,也要同步 agent skills、规则文件、工具目录和兼容链接。

但别做过头。

如果你只有一台机器,或者 dotfiles 很轻,Stow 依然够用。迁到 chezmoi 反而会多一层 apply、diff、add 的心智负担。

如果你有两三台开发机,经常改 shell、git、编辑器、AI agent 规则,还总在新机器上补漏,那就该考虑把配置从“文件集合”升级成“初始化流程”。

机器一多,记性就不再是方案。

流程才是。