相信很多人和我一样,在多台机器之间工作时,最头疼的事情之一就是同步各种配置文件——.bashrc、.zshrc、.gitconfig、.vimrc……每次换电脑或者重装系统,光是恢复这些配置就要折腾大半天。今天要介绍的 chezmoi,就是来解决这个问题的。
什么是 chezmoi?
chezmoi 是一个开源的 dotfiles 管理工具,它的核心思想很简单:把你在各台机器上个性化的配置文件(dotfiles)集中管理起来,通过 Git 进行版本控制,然后在每台机器上同步应用。
与普通的 cp 或 symlink 方案不同,chezmoi 支持:
- 模板化:配置文件中的敏感信息(如 API key、邮箱)可以用变量替代
- 差异化:可以为不同主机设置不同的配置
- 幂等性:多次运行结果一致,不会重复追加内容
- 跨平台:支持 Linux、macOS、Windows
安装 chezmoi
macOS
Linux
1 2 3 4 5 6
| curl -sfL https://get.chezmoi.io | sh
sudo apt install chezmoi sudo yum install chezmoi
|
Windows
安装完成后,初始化 chezmoi:
这会在 ~/.local/share/chezmoi(Linux/macOS)或 %LOCALAPPDATA%\chezmoi(Windows)创建一个 Git 仓库。
基本使用
1. 添加配置文件
假设你有一个 .bashrc 想纳入管理:
1 2 3 4 5 6
| chezmoi add ~/.bashrc
chezmoi cd touch rootBashrc
|
chezmoi 会自动把 ~/.bashrc 复制到它的管理目录,并在文件名加 dot_ 前缀,即 dot_bashrc。
2. 编辑配置文件
1 2 3 4 5 6
| chezmoi edit ~/.bashrc
chezmoi cd vim dot_bashrc
|
3. 查看变更
4. 应用变更
1 2 3 4 5
| chezmoi apply
chezmoi apply ~/.bashrc
|
5. 自动拉取和推送
如果你把 chezmoi 的 Git 仓库托管到 GitHub/Gitee,可以设置自动同步:
1 2 3 4 5
| git remote add origin git@github.com:yourusername/dotfiles.git
echo 'eval "$(chezmoi init --execute)"' >> ~/.bashrc
|
加入 Git 管理
chezmoi 本身就在 ~/.local/share/chezmoi 目录下初始化了一个 Git 仓库,我们只需要把它托管到 GitHub 或 Gitee 上,就能在多台机器之间同步了。国内推荐 Gitee,访问速度更快。
1. 在 Gitee 创建仓库
登录 Gitee,新建一个仓库,命名为 dotfiles(也可以叫其他名字),选择 Private(私有)或 Public(公开)都可以。
2. 关联远程仓库
1 2 3 4 5 6 7 8
| chezmoi cd
git remote add origin git@gitee.com:yourusername/dotfiles.git
git remote add github git@github.com:yourusername/dotfiles.git
|
3. 首次推送
1 2 3
| git add -A git commit -m "Initial commit: manage dotfiles with chezmoi" git push -u origin main
|
4. 在新机器上快速恢复
以后在任意新机器上,只需要一行命令就能恢复所有配置:
1 2 3 4 5
| bash -c "$(curl -fsSL https://raw.githubusercontent.com/yourusername/dotfiles/main/install.sh)"
chezmoi init --source=https://github.com/yourusername/dotfiles.git
|
更优雅的做法是先用 chezmoi 引导初始化:
1 2 3
| chezmoi init git@gitee.com:yourusername/dotfiles.git chezmoi apply
|
5. 日常更新流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| chezmoi edit ~/.bashrc
chezmoi diff
chezmoi apply
git add -A git commit -m "Update bashrc"
git push
|
6. 在多台机器间同步
假设你在公司电脑和家庭电脑都要用同一套配置:
1 2 3 4 5
| git push
git pull && chezmoi apply
|
或者设置每次打开终端自动拉取:
1
| echo 'eval "$(chezmoi init --execute)"' >> ~/.bashrc
|
这样每次开终端就会自动从远程拉取最新配置并应用。
模板化配置
chezmoi 最强大的功能之一是支持 Go 模板语法,这让你可以为不同主机设置不同配置。
创建模板文件
1
| chezmoi add --template ~/.gitconfig
|
这会创建一个 .gitconfig.tmpl 文件,内容可以这样写:
1 2 3 4 5 6 7
| {{- $name := .name -}} {{- $email := .email -}} [user] name = {{ $name }} email = {{ $email }} [alias] lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
|
配置主机信息
1 2 3 4 5 6
| cat > ~/.config/chezmoi/chezmoi.toml << 'EOF' [data] name = "Your Name" email = "your.email@example.com" EOF
|
使用加密敏感信息
1 2 3
| chezmoi secret key chezmoi add --encrypt ~/.netrc
|
多主机管理
chezmoi 支持为不同主机设置不同配置,非常适合公司电脑和个人电脑有不同需求的场景。
按主机名条件判断
1 2 3 4 5 6 7 8 9
| {{ if eq .chezmoi.hostname "work-pc" }} # 公司电脑特有的配置 [user] email = "work@company.com" {{ else }} # 个人电脑的配置 [user] email = "personal@mail.com" {{ end }}
|
使用 .chezmoi.<host>.tmpl
创建 .chezmoi.<hostname>.tmpl 文件,可以包含该主机特有的变量:
1 2 3
| echo 'name = "Work Name"' > ~/.config/chezmoi/chezmoi.work-pc.toml echo 'email = "work@company.com"' >> ~/.config/chezmoi/chezmoi.work-pc.toml
|
实用技巧
1. 导入现有配置
1 2
| chezmoi import ~/.bashrc ~/.zshrc ~/.vimrc
|
2. 干跑模式
3. 撤销变更
4. 查看状态
输出示例:
1 2 3
| M .bashrc # M = 已修改 A .zshrc # A = 新增 ? .viminfo # ? = 未跟踪
|
我的配置结构
分享一下我目前的 chezmoi 配置结构:
1 2 3 4 5 6 7 8 9 10
| ~/.local/share/chezmoi/ ├── dot_bashrc # ~/.bashrc ├── dot_zshrc # ~/.zshrc ├── dot_gitconfig # ~/.gitconfig ├── dot_gitconfig.tmpl # 模板版本 ├── dot_tmux.conf # ~/.tmux.conf ├── dot_config/ │ └── nvim/ # ~/.config/nvim/ └── scripts/ └── install.sh # 初始化脚本
|
总结
chezmoi 解决的不是什么高深莫测的问题,但它把「管理 dotfiles」这件事做得很优雅。对于需要频繁在多台机器间切换的开发者来说,它能节省大量重复配置的时间。
如果你还没有尝试过 dotfiles 管理工具,chezmoi 是一个很好的起点。它比直接用 symlink 更安全,比 Ansible/Puppet 轻量,比 rsync 灵活。
官网:https://chezmoi.io
GitHub:https://github.com/twpayne/chezmoi
有问题或建议?欢迎留言交流!