三台 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 会直接写穿到 repo | home 里是真实文件,不会自动污染源目录 |
| 多机同步 | Pro、Air、Mini 各有 clone,容易出现脏状态和冲突 | ~/.local/share/chezmoi 是源目录,用 Git 管 |
| 新机初始化 | 已有 ~/.zprofile、~/.gitconfig 时,常要手动删掉再 stow | chezmoi 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 add 或 re-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 规则,还总在新机器上补漏,那就该考虑把配置从“文件集合”升级成“初始化流程”。
机器一多,记性就不再是方案。
流程才是。
