3

在尝试恢复旧项目时,有时我不得不四处寻找旧的 Nixpkgs 提交以开始工作。

例如,我的大部分shell.nix文件都是这样开始的,

{pkgs ? import <nixpkgs> {} }:

pkgs.mkShell {
  # ...
}

这将从当前通道指向的提交中导入所有表达式,但是一段时间后,发生了太多更改,以至于我的项目将不再构建;然后我将不得不找到一个仍然有效的提交,然后从那里开始。

$ nix-shell --arg pkgs \
> 'import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/0c0fe6d85b92c4e992e314bd6f9943413af9a309.tar.gz") {}'

如果我当时可以从频道中保存工作提交,并在以后需要时有一些可靠的东西可以回退,那可能是最好的。

4

2 回答 2

5

>= nixos 20.09

nix-shell -p nix-info --run "nix-info -m"
  • 系统:"x86_64-linux"
  • 主机操作系统:Linux 5.9.15, NixOS, 20.09.2344.a3a3dda3bac (Nightingale)# 通道提交
  • 多用户?:yes
  • 沙盒:yes
  • 版本:nix-env (Nix) 2.3.9
  • 频道(根):"nixos-20.09.2344.a3a3dda3bac"#频道提交
  • 频道(用户):"nixos-20.09.2152.e34208e1003"#频道提交
  • nixpkgs:/nix/var/nix/profiles/per-user/root/channels/nixos

检查NixOS 历史a3a3dda3bac 中的结尾,例如20.09 版


我不会pkgs ? import <nixpkgs> {}用于开发与您正在运行的当前系统无关的环境

  • let而是通过变量在区域中导入例如

对于开发环境:

# nix-shell shell_test.nix --argstr commitNixpkgs "0c0fe6d85b92c4e992e314bd6f9943413af9a309 --show-trace

{pkgs ? import <nixpkgs> {},  commitNixpkgs ? "0c0fe6d85b92c4e992e314bd6f9943413af9a309" ; ref ? "refs/heads/nixpkgs-unstable", rev ? "502845c3e31ef3de0e424f3fcb09217df2ce6df6" , ...}:

let 
    nixPkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/${commitNixpkgs}.tar.gz") {config= { allowUnfree = true ; } ;} ; 
    # https://channels.nix.gsc.io/
    # git ls-remote https://github.com/nixos/nixpkgs | grep unstable
 
    # or via fetchGit 
    nixPkgs_fG = import (builtins.fetchGit {
       name = "nixpkgs-unstable";
       url = "https://github.com/nixos/nixpkgs-channels.git";
       ref = ${ref};        #"refs/heads/nixpkgs-unstable";
       rev = ${rev};        #"502845c3e31ef3de0e424f3fcb09217df2ce6df6"; 
   }) {config= { allowUnfree = true ; } ;  } ;
   # nix-shell -p nix-prefetch-git --run ' nix-prefetch-git https://github.com/nixos/nixpkgs.git refs/heads/nixos-unstable '

in 
  ...    
于 2021-03-20T10:14:21.040 回答
1

扩展 NixOS 讨论线程中提供的答案如何查看我的频道在哪个提交上?

注意在尝试任何这些方法之前,请确保您使用正确的用户发出命令!
无论哪种方式都不会造成伤害,但是如果您在 NixOS 上并以声明方式管理事物(如root重建系统时),那么您可能会得到与您需要的不同的提交哈希。(特别是如果您曾经发布过nix-channel --update没有,这也会为您的用户个人资料sudo设置一个频道。)

方法 0

根据NixOS wiki 的Nix 频道条目,“频道Nixpkgs中最新的“已验证”git 提交的名称。也就是说,在任何给定时间,通道都指向Github 上 Nixpkgs git 存储库中的特定提交;每个 Nix 频道实际上是 repo 中的一个 git 分支

$ nix-channel --list
nixos https://nixos.org/channels/nixos-20.09
-----                            ----------- 
(name)                          (branch-name)
#                                     |
#                                     V
#              https://github.com/NixOS/nixpkgs/tree/<branch-name>
#         i.e. https://github.com/NixOS/nixpkgs/tree/nixos-20.09

因此,如果您之前刚刚执行nix-channel --update过,并且它有效,只需在Nixpkgs reponix-shell的通道分支中查找最后一次提交。

方法一

Nix 手册的“第 12 章。通道”提到nix-channel --update使每个通道的 Nix 表达式的联合默认可用于nix-env操作(通过 symlink ~/.nix-defexpr/channels ”。

要查看~/.nix-defexpr/channels符号链接指向的位置,请使用readlink -f跟随符号链接链并将其结合起来ls以直截了当:

$ ls -l $(readlink -f ~/.nix-defexpr/channels)
total 6432
dr-xr-xr-x    2 root root      4096 Jan  1  1970 ./
drwxrwxr-t 8191 root nixbld 6569984 Feb  9 15:51 ../
lrwxrwxrwx    1 root root        78 Jan  1  1970 nixos -> /nix/store/k737c631q19n54fhjmnf68frg5dar14w-nixos-20.09.3009.8e78c2cfbae/nixos/
lrwxrwxrwx    1 root root        60 Jan  1  1970 manifest.nix -> /nix/store/a5wl1fri2sasnsb1i5zscni5h7kjg7d6-env-manifest.nix

我的频道名称是nixos,它指向

/nix/store/k7..4w-nixos-20.09.3009.8e78c2cfbae/nixos/
                                   -----------
                                        ^
                                        |
                                   channel-commit

并且提交哈希就在MAJOR.MINOR.PATCH 版本号之后。


旁白:要fetchTarball在问题中构造 tarball URL,请使用以下模板:

https://github.com/<user>/<repo>/archive/<full-or-abbr-commit-hash>.tar.gz

例如:

https://github.com/NixOS/nixpkgs/archive/8e78c2cfbae.tar.gz

或者,单击绿色的“代码”按钮,然后复制“下载 ZIP”链接的 URL(并将zip扩展名更改为tar.gz)。


有趣的事实:如果您nix-channel --update在方法 1 之前做过,那么 URLhttps://github.com/NixOS/nixpkgs/tree/<branch-name>https://github.com/NixOS/nixpkgs/tree/<channel-commit>将指向Nixpkgs 存储库中的相同位置。

于 2021-02-09T17:36:21.493 回答