每个开发者都有散落在 ~ 目录的 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 update
  • just apply → 一条命令同步所有配置
  • just diff → 部署前预览变更
  • just edit-config config_file=~/.zshrc → 快速编辑
  • just update → 拉取最新配置并应用

跨机器保持一致体验,不等于所有机器完全相同。更好的状态是:公共基础配置一致,机器差异显式,敏感信息隔离,部署前能看 diff。

7. 使用原则

chezmoi 适合把个人环境从“手工记忆”推进到“可恢复系统”。它也会引入一层工具复杂度,所以要有清晰边界。

先纳入高价值配置.zshrc.gitconfig、编辑器配置、终端任务入口值得管理;缓存、临时文件、机器生成文件不应该进入 source。

每次 apply 前先 diffchezmoi diff 是安全边界。配置管理工具一旦能批量写入家目录,就必须先看它准备改什么。

模板只表达真实差异:操作系统、主机名、工作/个人环境可以模板化;不要为了炫技把简单配置写成难读的条件树。

敏感信息分级处理:不是所有秘密都适合进 Git。能用密码管理器就不要硬塞进模板;能用机器本地环境变量就不要放进公共仓库。

和任务自动化配合just diffjust applyjust update 这类入口能减少记忆负担,也方便未来的自己或 Agent 判断配置同步流程。

dotfiles 的目标不是把每台机器变成同一台机器,而是让环境变化可理解、可恢复、可撤销。

延伸阅读