每个开发者都有散落在
~目录的 dotfiles:.zshrc、.gitconfig、nvim 配置、SSH 配置。它们不是零散偏好,而是个人工程环境的源代码。chezmoi 的价值不只是“换机器更快”,而是让配置有版本、有差异预览、有模板边界,也能把敏感信息和公开配置分开。
1. 为什么 dotfiles 需要治理
- 换电脑/重装系统:怎么快速恢复所有配置?手动复制容易遗漏
- 多机器同步:家里台式机、公司笔记本、云服务器,配置改了这边忘了那边
- 机器差异:macOS 和 Linux 路径不同,工作电脑和个人电脑需要加载不同模块
- 敏感信息:API key、数据库密码、SSH 私钥不能直接提交到 Git
传统做法是 Git 仓库 + 符号链接,适合简单配置,但处理不了模板化、机器差异和加密。chezmoi 适合在配置规模开始增长时接手:个人电脑、公司电脑、远程服务器、临时开发环境可以共享一套源配置,同时保留必要差异。
2. chezmoi 的核心设计
chezmoi 的核心是双层模型——source 目录和 target 目录分离。
Source 目录(~/.local/share/chezmoi/):你管理的”源码”,是一个普通 Git 仓库,存放模板和配置文件原始版本。
Target 目录(~/):实际生效的位置。chezmoi 把 source 里的文件部署到家目录对应位置。
source(~/.local/share/chezmoi/) → target(~/)
dot_gitconfig.tmpl → .gitconfig
dot_zshrc → .zshrc
dot_config/nvim/init.lua → .config/nvim/init.lua核心操作: chezmoi add <文件> 把文件纳入管理;chezmoi apply 部署到 target。
幂等性是关键设计——多次 apply 效果相同,不会重复修改,可安全用于自动化脚本。
3. 基础工作流
初始化:
chezmoi init && cd $(chezmoi source-path)
git remote add origin <仓库地址>添加配置: chezmoi add ~/.zshrc — 文件复制到 source 目录,自动加 dot_ 前缀。整个目录也可以纳入管理。
编辑配置:
chezmoi edit ~/.zshrc # 在 source 目录打开编辑
chezmoi apply # 部署变更到 target永远通过 chezmoi 编辑 source 文件,不要直接改 target——下次 apply 会被覆盖。
查看差异: chezmoi diff 预览 source 和 target 的差异;chezmoi status 列出状态不一致的文件。apply 前先 diff。
Git 管理: Source 目录就是普通 Git 仓库,正常 git add/commit/push。
在新机器恢复: chezmoi init --apply https://github.com/你/dotfiles 会克隆、初始化并部署配置。真正重要的不是命令短,而是这条路径可重复、可审计、可写进新机器初始化流程。
4. 模板化配置
不同机器需要不同配置——符号链接方案做不到,但 chezmoi 的模板系统可以。
chezmoi 使用 Go 的 text/template 引擎,文件名带 .tmpl 后缀即被当作模板处理。
{{ .chezmoi.os }} # 操作系统:darwin / linux
{{ .chezmoi.hostname }} # 主机名
{{ .chezmoi.username }} # 用户名条件语句:
{{- if eq .chezmoi.os "darwin" }}
export PATH="/opt/homebrew/bin:$PATH"
{{- else }}
export PATH="/home/linuxbrew/.linuxbrew/bin:$PATH"
{{- end }}实际例子 — gitconfig 不同凭据存储:
{{- if eq .chezmoi.os "darwin" }}
[credential]
helper = osxkeychain
{{- else }}
[credential]
helper = libsecret
{{- end }}实际例子 — .zshrc 工作 vs 个人:
{{- if eq .chezmoi.hostname "work-macbook" }}
export WORK_ENV=1
{{- else }}
export PERSONAL_ENV=1
{{- end }}查看可用变量: chezmoi data 打印所有模板变量。
5. 敏感信息管理
不想把 API key、密码、token 存到 Git?chezmoi 提供多种方案。
age 加密(推荐): chezmoi 原生支持 age 加密,加密后的文件可安全提交到 Git,apply 时自动解密。
age-keygen -o ~/.config/chezmoi/age.txt
chezmoi add --encrypt ~/.config/api-keys.env模板中引用:{{ include "secret.env" | ageDecrypt }}。
环境变量注入: 敏感信息不存文件,通过 ~/.zshenv 注入,模板中用 {{ .github_token }} 引用。
密码管理器集成: 支持 1Password、Bitwarden、Vault:{{ (onepasswordRead "op://vault/item/field") }}。
建议: 低敏感(偏好设置)直接存 Git;中敏感(邮箱、工作路径)用模板变量和环境变量;高敏感(API key、私钥、生产凭据)用 age/sops 加密或密码管理器。私钥本身通常不应该进入普通 dotfiles 仓库,即使加密也要慎重。
6. chezmoi + just 的协作模式
把 chezmoi 操作封装到 justfile:
apply: ; chezmoi apply
diff: ; chezmoi diff
edit-config: ; chezmoi edit {{config_file}}
update: ; chezmoi updatejust apply→ 一条命令同步所有配置just diff→ 部署前预览变更just edit-config config_file=~/.zshrc→ 快速编辑just update→ 拉取最新配置并应用
跨机器保持一致体验,不等于所有机器完全相同。更好的状态是:公共基础配置一致,机器差异显式,敏感信息隔离,部署前能看 diff。
7. 使用原则
chezmoi 适合把个人环境从“手工记忆”推进到“可恢复系统”。它也会引入一层工具复杂度,所以要有清晰边界。
先纳入高价值配置:.zshrc、.gitconfig、编辑器配置、终端任务入口值得管理;缓存、临时文件、机器生成文件不应该进入 source。
每次 apply 前先 diff:chezmoi diff 是安全边界。配置管理工具一旦能批量写入家目录,就必须先看它准备改什么。
模板只表达真实差异:操作系统、主机名、工作/个人环境可以模板化;不要为了炫技把简单配置写成难读的条件树。
敏感信息分级处理:不是所有秘密都适合进 Git。能用密码管理器就不要硬塞进模板;能用机器本地环境变量就不要放进公共仓库。
和任务自动化配合:just diff、just apply、just update 这类入口能减少记忆负担,也方便未来的自己或 Agent 判断配置同步流程。
dotfiles 的目标不是把每台机器变成同一台机器,而是让环境变化可理解、可恢复、可撤销。