chezmoi:配置纳管、差异与跨机同步
本页目录
chezmoi 把配置的源文件维护在一个目录中,再根据当前机器的信息生成目标文件。Git 保存源状态的历史;chezmoi 负责把这些源文件转成家目录里的实际配置。理解这两个职责,可以避免把“已经提交”误认为“已经应用”。
三种状态
| 状态 | 举例 | 由谁改变 |
|---|---|---|
| 源状态 | chezmoi 源目录里的 dot_wezterm.lua | 编辑器、Git、chezmoi add |
| 目标状态 | 当前机器上模板渲染后的 .wezterm.lua 内容 | chezmoi 计算 |
| 实际状态 | 家目录中当前存在的 .wezterm.lua | apply 或直接编辑 |
chezmoi diff 比较实际状态与预期目标状态。若直接改了家目录里的文件,源状态不会自动跟着修改,需要重新纳入或合并。
首次加入一个文件
假设 .wezterm.lua 已存在且工作正常。先初始化源目录:
再只加入这一个文件:
查看它的源路径和当前差异:
刚加入而未修改时,通常没有目标差异。此时还没有把仓库发布到远程;远程地址与 Git 提交需要另行配置。
编辑、审阅、应用
这一步编辑的是源文件。保存退出后先检查:
确认只包含预期修改,再执行:
最后再次查看 diff,并启动应用确认配置有效。diff 为空说明该目标与期望内容一致,不等于应用一定接受其中的参数。日常操作
进入源仓库后再提交:
在新开的源目录 Shell 中运行 git status,选择要提交的文件,再按 Git 手册审阅和提交。完成后 exit 返回原 Shell。不要把 chezmoi cd && git ... 理解成在同一层 Shell 中永久切换目录的普通 cd。
模板处理机器差异
给已纳管文件添加模板属性:
然后通过 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,再应用到指定目标。配置包含脚本时,也要考虑脚本产生的外部状态是否能随文件回退。
完成一次练习:加入一个无关紧要的配置、改变源文件、预览、应用,再还原源内容并应用。能说明每一步改变了哪种状态,就具备跨机同步的基础。