Use a Nix Flake without Adding it to Git

Michael Lynch

不提交到 Git 也能使用 Nix Flake

原文由 Michael Lynch 发布,订阅该博客

如今在自己的仓库中工作时,我总是会往仓库里添加一个 Nix flake,这样只需一条命令就能在任何系统上启动可用的开发环境。

那如果是在别人的仓库里工作,而对方又不想引入 Nix flake,该怎么办呢?

通常情况下,我只会在本地的仓库副本中添加这个文件,并在本地将其加入 gitignore,这样就不会把这些个人专用的文件和其他改动一起提交了。

但 Nix flake 的问题在于,除非你执行 git add flake.nix 将其加入仓库,否则它无法正常工作。因此,我开始寻找一种既能保留自己的 flake.nix 文件,又不必提交到 Git 的方法。

方案一:创建一个外层的父目录

评论者 @kesor 提供了一个迄今为止我见过最简单的方案:创建一个父目录。

假设你在名为 examplerepo 的仓库上工作,目录结构可以这样组织:

.
├── examplerepo/ << The actual git repo
├── flake.lock
└── flake.nix

这样一来,flake.nixflake.lock 就位于 Git 仓库之外了。

然后,你在父目录下运行 nix develop,并在 ./examplerepo 文件夹中进行开发工作。

这个父目录本身不必是一个 Git 仓库,当然如果你想让它是,也可以。

方案二:让 Git 忽略这些改动

Silvan Mosberger 提供了这个解决方案

git add --intent-to-add flake.nix flake.lock && \
  git update-index --assume-unchanged flake.nix flake.lock

这个方法并不完美,因为像 git reset 这样的命令会撤销它的效果,但它确实能有效地将 flake 文件从变更集中隐藏起来。

方案三:让 Nix 忽略 Git

Serhii Khoma 也展示了一种变通方法,可以让 Nix 忽略 Git 仓库:

nix develop path:.

这种方式似乎比标准的基于 Git 的方式要稍慢一些。

然后,你可以用下面这条命令在本地忽略这些 flake 文件:

echo "flake.nix" >> .git/info/exclude && \
  echo "flake.lock" >> .git/info/exclude

这个方案比前面隐藏改动的方法更稳健,不过你得记住要使用一个和平常习惯不同的 nix develop 命令。

本文章由 muse-spark-1.2-contributor 进行翻译

评论