chezmoi是一款基于模板的dot配置管理器,使用go语言编写,并使用https://pkg.go.dev/text/template来对配置进行模板化以适应不同平台差异。

实际上,chezmoi使用的是sprig扩展了的go语言的模板:http://masterminds.github.io/sprig/

chezmoi的灵感来自于https://puppet.com/

dot配置管理器对比

Comparison Guide # 列举了其他几款管理器:

  • dotbot
  • rcm
  • homesick
  • yadm

这几款貌似都不支持Windows。

chezmoi上手

使用scoop安装:

scoop bucket add twpayne https://github.com/twpayne/scoop-bucket && scoop install chezmoi

chezmoi init会在~/.local/share/chezmoi创建一个git仓库。

最新版的git会提示把主分支改为master以外的名字,比如main或者trunk,可以使用下面的配置

  • git config --global init.defaultBranch <name>
  • git branch -m <name>

使用chezmoi edit ~/.bashrc会使用默认编辑器来编辑 ~/.local/share/chezmoi/dot_bashrc。使用chezmoi -v apply来将改动同步到~/.bashrc

chezmoi cd可以开启一个新的shell,进到~/.local/share/chezmoi。此处可以执行git命令来将配置存入git仓库。

也就是说chezmoi将git配置管理交给了用户,然后可以将git配置同步到github, sr.ht等git服务提供商。

如何将配置搬到其他机子上呢:

chezmoi init https://github.com/username/dotfiles.git
chezmoi apply

或者如果仓库命名方式就是dotfiles,那么可以:

chezmoi init --apply username 

Templating Guide

模板文件要么以.tmpl结尾,要么在.chezmoitemplates目录。

使用chezmoi data来列举模板数据,数据来自:

  • .chezmoi
  • .chezmoidata.<format>,可以是json, toml或者yaml
  • 配置文件中的data片区

将配置文件添加为模板:chezmoi add --template ~/.zshrc

同上,并替换其中的模板数据:chezmoi add --autotemplate ~/.zshrc

将既有配置转化为模板:chezmoi chattr +template ~/.zshrc

手动创建模板文件:

chezmoi cd
$EDITOR dot_zshrc.tmpl

.chezmoitemplates中的模板必须手动创建:

chezmoi cd
mkdir -p .chezmoitemplates
cd .chezmoitemplates
$EDITOR mytemplate

对模板进行测试:chezmoi execute-template "{{ .chezmoi.hostname }}",其中"{{ .chezmoi.hostname }}"代表的是模板内容。

也可以这么来:chezmoi execute-template < dot_zshrc.tmpl

剩余略

Manage machine-to-machine differences

使用模板,在~/.config/chezmoi/chezmoi.toml中创建:

[data]
    email = "me@home.org"
  • 保存私有数据的话,需要确保chezmoi.toml的访问权限为0600
  • 除了toml以外,还可以使用json或者yaml,只要https://github.com/spf13/viper支持即可
  • 变量名以字母开头,可以包含数字和字母

使用chezmoi add --autotemplate ~/.gitconfig可以自动对添加的.gitconfig中的配置自动进行模板变量检查。

chezmoi re-add可以重新添加某配置,只是不支持模板。也可以通过chezmoi merge来化解冲突。

使用chezmoi data可以列举出所有支持的模板变量。

Use KeePassXC

需要在配置文件~/.config/chezmoi/chezmoi.toml中添加类似如下配置:

[keepassxc]
    database = "/home/user/Passwords.kdbx"

目前Chezmoi只能明文输入密码,参考ReadPassword

如何在Go中读取密码,参考getpasswd functionality in Go?

Comparison Guide

  • dotbot
  • rcm
  • homesick
  • yadm
  • gnu stow

Reference Manual

一些概念:

  • source state,可用于本机的配置文件
  • source directory,chezmoi用于保存配置的git仓库:~/.local/share/chezmoi
  • target state,已用于本机的配置文件
  • destination directory,默认为home目录
  • target,目标配置文件,目录或者符号链接
  • destination state,默认为home目录里面的所有配置文件
  • config file,用于chezmoi自身的配置文件,默认为~/.config/chezmoi/chezmoi.toml

其他

小贴士

  • 使用doskey cm=chezmoi $*可以在cmd.exe里面起一个短名cm用来替代chezmoi,参考Aliases in Windows command prompt
  • 使用chezmoi unmanaged可以列举所有不归属chezmoi管理的文件。
  • 可以通过source state中的.chezmoiignore来显示阻止某些文件添加到chezmoi管理。
  • 可以通过chezmoi doctor来检查当前主机上chezmoi的配置状况

(未完待续)