9

我创建了自己的存储库来获取一些 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吗?如何“重建”或重新下载存储库?

PS实际上我在其中创建了一个带有 fetchgit 的派生,但它失败了,因为没有下载子模块。因此,上述情况简化了我的问题。

4

3 回答 3

6

不是错误,这是设计使然。

指定散列的派生称为固定输出派生,它们仅检查散列是否与存储中的任何现有派生匹配并使用它。因此,您的 fetchSubmodules 更改将被忽略。

有关更多讨论,请参阅https://github.com/NixOS/nix/issues/969

于 2017-01-08T13:28:10.727 回答
4

要解决此问题,您需要将散列更改为某个值,该值还不是 nix 存储中任何路径的有效散列。

对于固定输出派生(那些具有明确指定哈希并且只有那些获得网络访问权限的派生),如果哈希已经与 nix 存储中的路径匹配,则 nix 将跳过下载并仅使用现有路径。所以稍微改变哈希(使其不再匹配)应该足以强制重建。

于 2017-01-13T23:09:30.253 回答
1

获取子模块将导致具有不同哈希的包。解决此问题的最简单方法是将哈希更改为无效值并重建包。错误消息将包含正确的哈希。使用它并重建。

于 2017-09-15T00:54:49.093 回答