chezmoi 是一个用 [[Go]] 编写的开源 dotfiles 管理工具,帮助开发者在多台机器上统一管理个人配置文件(如 ~/.gitconfig、~/.zshrc、~/.vimrc 等)。
发音为 /ʃeɪ mwa/ (shay-moi),是法语”在我家”的意思,名称寓意让每台机器都拥有”家的感觉”。
区别于 [[GNU Stow]] 这类基于符号链接的工具,chezmoi 将配置文件复制到目标位置(而非创建 symlink),并通过 Go 模板语言实现机器之间的差异化配置,同时内置密钥管理和加密能力。
chezmoi 解决的问题
传统 dotfiles 管理方式(直接用 git 仓库 + symlink)有几个痛点:
一是密钥安全问题。git 不适合存储密码、API 密钥等敏感内容,一旦误提交到公开仓库就可能立即造成泄露。
二是多机差异问题。工作机和个人机的 git 邮箱不同、macOS 和 Linux 的配置路径不同,维护多套配置文件繁琐。
三是跨平台问题。[[GNU Stow]] 仅支持 Unix 系统,且依赖 symlink,在 Windows 上无法正常工作。
chezmoi 通过模板化、加密和声明式管理解决了上述问题。
核心功能
模板化配置是 chezmoi 的核心能力。基于 [[Go]] 标准库的 text/template,同一份配置文件可以根据主机名、操作系统、环境变量等条件动态渲染出不同内容。例如:
[user]
name =
email = [email protected]@gmail.com
加密与密钥管理方面,chezmoi 原生支持 age、gpg、git-crypt 和 transcrypt 对文件加密,也支持从 1Password、Bitwarden、Vault、KeePassXC 等密码管理器中动态读取密钥,敏感内容永远不会以明文形式出现在 git 仓库中。
差异化忽略支持对不同机器忽略不同文件,例如 VPN 配置只在工作机上管理,而不出现在个人机上。
脚本执行支持在 apply 时运行安装脚本,并通过 onchange_ 前缀实现”只在配置变更时重新执行”,避免每次 apply 都重跑 Homebrew 安装等耗时操作。
干运行与 diff 模式支持 chezmoi diff 查看将要应用的变更,chezmoi apply --dry-run 模拟执行,对新机器上线特别有用。
工作原理
chezmoi 维护一个”源目录”(默认在 ~/.local/share/chezmoi),其中的文件名通过前缀约定来描述意图:
dot_前缀:对应目标路径中的.,例如dot_zshrc→~/.zshrcprivate_前缀:文件应设置为仅所有者可读(权限 0600)executable_前缀:文件应具有可执行权限encrypted_前缀:文件内容已加密存储once_前缀:脚本只执行一次onchange_前缀:脚本在内容变更时才重新执行
执行 chezmoi apply 时,chezmoi 读取源目录中的文件,渲染模板,解密加密文件,最后将结果写入 Home 目录对应位置。
安装与初始化
一行命令安装并初始化(将 GITHUB_USERNAME 替换为你的 GitHub 用户名):
sh -c "$(curl -fsLS chezmoi.io/get)" -- init --apply GITHUB_USERNAME
macOS 用 Homebrew 安装:
brew install chezmoi
Linux 各发行版也可通过包管理器安装,或直接下载二进制文件。
初始化一个新的 chezmoi 配置(不从 git 仓库拉取):
chezmoi init
日常使用
添加一个文件到 chezmoi 管理:
chezmoi add ~/.zshrc
chezmoi add ~/.gitconfig
进入 chezmoi 源目录(方便直接编辑):
chezmoi cd
查看将要应用的变更:
chezmoi diff
将源目录中的配置应用到 Home 目录:
chezmoi apply
从 git 仓库拉取最新配置并应用:
chezmoi update
编辑某个已托管的文件后直接应用:
chezmoi edit ~/.zshrc --apply
对比分析
| 特性 | chezmoi | [[GNU Stow]] | YADM |
|---|---|---|---|
| 实现方式 | 文件复制 + 模板 | 符号链接 | git 包装器 |
| 模板支持 | 内置 Go 模板 | 无 | 依赖外部工具(已停维) |
| 密钥管理 | 内置多种加密 | 无 | 有限 |
| 多 OS 支持 | 优秀 | 需手动处理 | 基础 |
| Windows 支持 | 支持 | 不支持 | 不支持 |
| 停止使用成本 | 低(文件即原文件) | 需删除 symlink | 低 |
| 学习曲线 | 中等 | 极低 | 低 |
与 [[dotbot]] 相比,chezmoi 的模板能力更强,密钥管理更完善,但 dotbot 的 YAML 配置风格对习惯声明式配置的用户更直观。
适用场景
同时使用多台机器(工作机、家用机、云服务器)的开发者最能受益于 chezmoi。
配置文件中含有敏感信息(API 密钥、私有地址等)需要安全管理的场景,chezmoi 的加密集成是最佳选择。
在 macOS、Linux 乃至 Windows 跨平台工作的开发者,可以用同一套源文件生成各平台的差异化配置。
对于想要在新机器上实现”一键还原工作环境”的工程师,chezmoi 配合 Homebrew Bundle 或 Nix 可以做到完整的环境复现。
优势与挑战
优势方面,chezmoi 文档详细、社区活跃,内置功能几乎涵盖所有 dotfiles 管理场景,且单一二进制无外部依赖。由于使用文件复制而非 symlink,随时停止使用都不需要额外清理工作。
挑战方面,源目录中的文件名加了 dot_ 等前缀,与实际路径不完全对应,初期会有一定认知成本。对于只管理少量配置文件、无跨机需求的用户,chezmoi 的功能可能显得过重,简单的 git bare repo 方式或许更合适。
最后
chezmoi 是目前功能最完整、维护最积极的 dotfiles 管理工具之一,尤其适合有跨设备、跨平台需求或需要在配置中处理敏感信息的开发者。从 [[dotbot]] 或 [[GNU Stow]] 迁移到 chezmoi 有一定学习成本,但长期来看模板化和密钥管理带来的收益十分显著。