chezmoi:配置纳管、差异与跨机同步

本页目录

chezmoi 把配置的源文件维护在一个目录中,再根据当前机器的信息生成目标文件。Git 保存源状态的历史;chezmoi 负责把这些源文件转成家目录里的实际配置。理解这两个职责,可以避免把“已经提交”误认为“已经应用”。

三种状态

状态举例由谁改变
源状态chezmoi 源目录里的 dot_wezterm.lua编辑器、Git、chezmoi add
目标状态当前机器上模板渲染后的 .wezterm.lua 内容chezmoi 计算
实际状态家目录中当前存在的 .wezterm.luaapply 或直接编辑

chezmoi diff 比较实际状态与预期目标状态。若直接改了家目录里的文件,源状态不会自动跟着修改,需要重新纳入或合并。

首次加入一个文件

假设 .wezterm.lua 已存在且工作正常。先初始化源目录:

chezmoi init

再只加入这一个文件:

chezmoi add ~/.wezterm.lua

查看它的源路径和当前差异:

chezmoi source-path ~/.wezterm.lua
chezmoi diff ~/.wezterm.lua

刚加入而未修改时,通常没有目标差异。此时还没有把仓库发布到远程;远程地址与 Git 提交需要另行配置。

编辑、审阅、应用

chezmoi edit ~/.wezterm.lua

这一步编辑的是源文件。保存退出后先检查:

chezmoi diff ~/.wezterm.lua

确认只包含预期修改,再执行:

chezmoi apply ~/.wezterm.lua

最后再次查看 diff,并启动应用确认配置有效。diff 为空说明该目标与期望内容一致,不等于应用一定接受其中的参数。日常操作

进入源仓库后再提交:

chezmoi cd

在新开的源目录 Shell 中运行 git status,选择要提交的文件,再按 Git 手册审阅和提交。完成后 exit 返回原 Shell。不要把 chezmoi cd && git ... 理解成在同一层 Shell 中永久切换目录的普通 cd。

模板处理机器差异

给已纳管文件添加模板属性:

chezmoi add --template ~/.wezterm.lua

然后通过 chezmoi edit 编辑源内容。在完整 WezTerm Lua 配置中,可用模板选择 Windows 启动程序:

{{ if eq .chezmoi.os "windows" }}
config.default_prog = { "pwsh.exe", "-NoLogo" }
{{ end }}

这只是配置中的一段,config 的建立和返回见 WezTerm。查看当前机器的数据可用 chezmoi data,但其中可能包含个人配置,不宜直接贴到公开问题中。

用 chezmoi cat ~/.wezterm.lua 查看渲染后的完整目标,再运行应用自己的配置检查。源模板语法正确和最终 Lua 语法正确需要分别验证。

文件属性与纳管边界

dot_ 表示点文件,private_ 限制目标权限,executable_ 设置可执行属性,.tmpl 表示模板。文件名前缀表达的是目标属性;private_ 并不加密 Git 仓库里的内容。源状态属性

适合纳管的是手工维护、需要跨机器一致的配置。插件缓存、日志、生成主题和会话数据库一般应由工具重新生成。第三方大型桌面外壳应保存上游版本与本地补丁,避免将整个安装树不加区分地当作手工配置。

脚本类源文件会在应用过程中执行。首次拉取其他人的仓库,应先审阅脚本、模板和目标范围,再应用;不应把 init --apply 当作无需检查的通用安装入口。

两台机器都改过时

先保留两边实际配置,再在源仓库中获取远程更新并解决冲突。需要把目标文件中的临时修改合入源文件时,可使用 chezmoi merge;单纯重新 add 会更新源状态,应先明确哪份内容应该保留。

恢复时,Git 可以找回旧源文件,但不会自动重写家目录。还原源内容后,重新检查 chezmoi diff,再应用到指定目标。配置包含脚本时,也要考虑脚本产生的外部状态是否能随文件回退。

完成一次练习:加入一个无关紧要的配置、改变源文件、预览、应用,再还原源内容并应用。能说明每一步改变了哪种状态,就具备跨机同步的基础。