我创建自己的存储库来获取一些git源。
# packages.nix
with (import <nixpkgs> {});
rec {
rustcSource = fetchgit {
url = https://github.com/rust-lang/rust;
rev = "3191fbae9da539442351f883bdabcad0d72efcb6";
sha256 = "0w1l14kz9kxyj5dw3w9xxk1fzww5xqs3sf8saay0mh7nkmvrdb59";
};
}
然后我建立rustcSource
,
sudo nix-env -f package.nix -A rustcSource
它显示了/nix/store/096fpy9qjbz5r14aadjnq9d2md9ql9cg-rust-3191fba
的商店路径。问题是,我忘了下载它的子模块,所以我改变我的表达式以包含子模块,
with (import <nixpkgs> {});
rec {
rustcSource = fetchgit {
url = https://github.com/rust-lang/rust;
rev = "3191fbae9da539442351f883bdabcad0d72efcb6";
sha256 = "0w1l14kz9kxyj5dw3w9xxk1fzww5xqs3sf8saay0mh7nkmvrdb59";
leaveDotGit = true;
fetchSubmodules = true;
};
}
但是,我发现nix-build
不会重新计算哈希并看到路径已经构建。因此,它最终不会下载子模块。
问:这是nix bug吗?如何“重建”或重新下载存储库?
P.S。实际上我在其中创建了一个带有fetchgit的派生,但它失败了,因为没有下载子模块。所以,上面的案例简化了我的问题。
答案 0 :(得分:4)
不是错误,这是设计原因。
指定散列的派生称为固定输出派生,它们仅检查散列是否与存储中的任何现有派生相匹配并使用它。因此,忽略了fetchSubmodules更改。
有关更多讨论,请参阅https://github.com/NixOS/nix/issues/969
答案 1 :(得分:3)
要解决此问题,您需要将哈希值更改为某个值,该值不是nix存储中任何路径的有效哈希值。
对于固定输出派生(那些具有指定显式哈希且仅获得网络访问权限的派生),如果哈希已经与nix存储中的路径匹配,则nix将跳过下载并仅使用现有路径。所以稍微改变哈希(以便它不再匹配)应该足以强制重建。
答案 2 :(得分:1)
获取子模块将导致包具有不同的哈希值。解决此问题的最简单方法是将哈希值更改为无效值并重新生成包。错误消息将包含正确的哈希。使用它并重建。