我创建了自己的存储库来获取一些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没有重新计算散列并看到路径已经构建。因此,它最终没有下载子模块。
问:是零虫吗?如何“重建”或重新下载存储库?
实际上,我在其中创建了一个带fetchgit的派生,但是由于子模块没有下载,它失败了。因此,上述情况简化了我的问题。
发布于 2017-01-08 13:28:10
不是窃听器,这是故意的。
指定哈希的派生被称为固定输出派生,它们只检查哈希是否与存储中的任何现有派生匹配并使用该派生。因此,您的fetchSubmodules更改将被忽略。
有关更多讨论,请参见https://github.com/NixOS/nix/issues/969
发布于 2017-01-13 23:09:30
要解决这个问题,您需要将散列更改为某个值,该值并不是nix存储中任何路径的有效散列。
对于固定输出派生(那些指定了显式散列,并且只有那些获得网络访问),如果散列已经匹配到nix存储中的路径,则nix将跳过下载,只使用现有路径。因此,稍微修改散列(使其不再匹配)就足以强制进行重新构建。
发布于 2017-09-15 00:54:49
获取子模块将导致具有不同哈希的包。解决此问题的最简单方法是将散列更改为无效值并重新构建包。错误消息将包含正确的哈希。用它重建。
https://stackoverflow.com/questions/41486747
复制相似问题