半公开Nix配置的版本控制Rethink
2 min
前文的方案的问题是,私有部分语义上保存的是一个 diff, 而 push 到 private repository 的是整个历史+该 diff, 于是:
- 即使私有部分没有发生变化,只要公开部分变了,还是得 rebase 和 push 到 private repository。
- main 的前头始终要顶着一个加了私有部分的 commit。即使有自动 rebase 比较方便,但低摩擦不是无摩擦。
- 不太方便对私有部分进行版本控制,否则 rebase 会带着一大堆 commit。
那么解决方案很简单,既然语义上私有部分保存的是一个 diff, 那就存 diff。
直接存 patch 不方便看,所以还是存 nix 文件。这个时候可以利用 flake-parts 模块:
- 有必要隐藏的内容,定义 option,带上默认值(确保不影响公开仓库 eval)。
- 私有部分集中到一个目录
private-modules/里,设定相关 options。这部分不在公开仓库里。私有仓库就是这个目录的内容,可以版本控制。 flake.nix里额外 importprivate-modules/里的模块(如果目录存在)- 自己部署时,用 rsync 组装公开仓库和私有仓库(
private-modules/),就有了一个带有私有部分的完整 flake。而仅有公开仓库的话就是按默认值。
虽然私有部分没法随意 patch 原仓库了,但本来就不需要。这样得到的完全就是一个正常版本控制的仓库。