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 = work@company.compersonal@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~/.zshrc
  • private_ 前缀:文件应设置为仅所有者可读(权限 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 有一定学习成本,但长期来看模板化和密钥管理带来的收益十分显著。

相关链接