【免费下载链接】hjem
Streamlined, elegant $HOME management with Nix
Hjem 是一个基于 Nix 的 $HOME 管理工具,其 Standalone 模式为每次配置变更自动生成 generation(版本快照),通过 rollback 命令即可一键回滚。本文将带你实战 Hjem Standalone 的 Generations 与 Rollback 机制,让你对 $HOME 下的配置变更做到"改错了随时撤销"。
为什么 Standalone 模式需要"撤销键"
Hjem 的核心理念是:用声明式清单(manifest)管理你$HOME下的文件——比如~/.config里的各种 dotfiles。在非 NixOS 系统上,你可以直接用hjem standalone命令把配置应用到当前用户。
但配置管理最怕一件事:改坏了没有退路。Hjem Standalone 借鉴了 NixOS 的经典思路——每次成功应用配置都会保存一个 generation,任何一次应用失败都绝不动你现有的文件。这样"回滚"就不是重建,而是切回旧版本。
💡 想回顾整体背景,可先看 README.md 中的 Standalone CLI 一节。
快速上手:从 init 到第一次 switch
如果你还没初始化过 Hjem Standalone,两条命令即可:
hjem standalone init hjem standalone switch --flake ~/.config/hjeminit会在~/.config/hjem下生成hjem.nix、示例 dotfiles 和一个最小flake.nix;switch负责"求值 + 应用",并且成功后自动存档为新 generation。
加上--switch参数可以让 init 直接应用初始配置;用--dir PATH可以把配置放到别处。详见 docs/inputs/standalone.md。
每次 switch 都在做什么:Generation 的产生机制
每一次成功的switch背后都有三步动作(实现位于 cli/crates/hjem-core/src/lib.rs#L931-L968):
- 求值与验证——把
--config指定的hjem.nix或 flake 输出求值为 v3 清单(格式约束见 manifest/v3.cue); - 原子应用——通过 smfh 把文件安全地链接到目标位置;
- 存档 generation——把本次的 manifest 完整保存到状态目录,并写入 GC 根,保证关联的 Nix store 路径不会被垃圾回收误删。
所有状态默认存放在~/.local/state/hjem/standalone($XDG_STATE_HOME已设置时位于其下的hjem/standalone)。目录结构大致如下:
~/.local/state/hjem/standalone/ ├── generations/ │ ├── generation-1780000000-123456789/ ← 每个版本一个目录 │ │ ├── manifest.json │ │ └── gc-roots/ │ └── generation-1780000099-987654321/ ├── current/ ← 当前生效的 manifest 状态 ├── current-generation ← 记录当前 generation 的 ID └── current-profile ← 当前版本安装的 packages 环境generation 的 ID 是generation-<unix秒>-<纳秒>格式,天然按时间排序,最方便的是:你根本不需要记 ID,回滚到"上一个版本"直接省略参数即可。
回滚实操:三种最常用的命令
查看现有版本
hjem standalone generations会列出状态目录下所有 generation 的路径。没有任何版本时会提示No generations found。
一键回滚到上一版
hjem standalone rollback这是最常用的一条。它会自动找到"当前版本的前一个 generation",重新应用其 manifest,并同步切回对应的包环境(current-profile)。如果只剩一个版本,会明确报错No previous generation available for rollback,而不是静默失败。
回滚的核心逻辑见 cli/crates/hjem-core/src/lib.rs#L772-L805。
精准回滚到指定版本
修改历史较长、需要跳回某个特定版本时,用--generation指定 ID:
hjem standalone rollback --generation generation-1780000000-123456789ID 不合法或对应 manifest 缺失时,Hjem 会直接拒绝并给出Generation manifest missing提示。
另外,hjem standalone switch --rollback等价于"回滚上一版",适合习惯 switch 工作流的场景(两者不可与--config/--flake混用,见 cli/README.md)。
版本太多?用 expire-generations 清理
回滚能力越强,版本越容易越积越多。Hjem 提供了两套清理策略:
# 只保留最近 10 个版本 hjem standalone expire-generations --keep-last 10 # 删除 30 天前的版本(相对时间格式:-N days / -Nd) hjem standalone expire-generations '-30 days'也支持 Unix 秒、YYYY-MM-DD等时间戳格式。此外remove-generations可按 ID 精确删除,适合手工整理。
🧹 清理不只是删目录:因为每个 generation 都持有 GC 根,删除版本会连带释放其独占的 Nix store 空间;而只要版本还在,即便你手动执行nix-collect-garbage,旧版引用的文件依然安全。这一行为在集成测试 tests/nixos/standalone.nix#L174-L205 中有完整验证。
安全护栏:Hjem 明确拒绝的 3 件事
Hjem 的"可逆"建立在一系列防御性设计之上:
| 场景 | Hjem 的行为 |
|---|---|
| 删除当前正在使用的 generation | 拒绝,提示先回滚再删除(Refusing to remove current generation) |
| 对不存在的 generation ID 执行 rollback | 直接报错,不做任何变更 |
expire-generations波及当前版本 | 当前版本被无条件保护,永远跳过 |
| 新配置求值/验证失败 | 不触碰任何现有文件,旧 generation 原样保留 |
也就是说:即使最坏情况——你连回滚都执行错了——现有的 $HOME 文件也不会丢。
实战工作流小结
一个典型的"大胆改配置"循环长这样:
hjem standalone switch --config ./hjem.nix # ① 应用新配置(自动存档) hjem standalone generations # ② 确认新版本已生成 hjem standalone rollback # ③ 发现不对?一键回退 hjem standalone expire-generations --keep-last 10 # ④ 定期瘦身🛡️ 记住核心心智模型:switch 是"存档",rollback 是"读档",expire 是"删档"——三者共同让 $HOME 配置变更从"不可逆的危险操作"变成"可反复试错的日常操作"。
延伸阅读
- 完整 Standalone 文档(含 manifest 三种来源
--manifest/--config/--flake详解):docs/inputs/standalone.md - CLI 命令面总览与诊断开关(
-v/-vv/-vvv):cli/README.md - standalone 子命令的参数定义:cli/crates/hjem/src/main.rs
- generation 记录、GC 根与回滚实现的完整源码:cli/crates/hjem-core/src/lib.rs
- 回滚行为的自动化集成测试:tests/nixos/standalone.nix
【免费下载链接】hjem
Streamlined, elegant $HOME management with Nix
相关推荐
VDO.Ninja高级功能:WHIP/WHEP流媒体技术实战
VDO.Ninja高级功能:WHIP/WHEP流媒体技术实战 VDO.Ninja是一款强大的WebRTC工具,可将远程视频源引入OBS或其他工作室软件。其中WH
音视频WebRTC视频前端直播Home Manager 配置回滚实战指南:用 `home-manager switch --rollback` 恢复上一代用户环境
Home Manager 配置回滚实战指南:用 home manager switch rollback 恢复上一代用户环境 Nix 生态以“可复现、可回退”著
开发工具配置管理CLI断网不慌,配置自动回滚:拆解 LuCI Mobile 的 apply-with-rollback 协议与 6 种回滚场景
断网不慌,配置自动回滚:拆解 LuCI Mobile 的 apply with rollback 协议与 6 种回滚场景 LuCI Mobile 是一款用智能手
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考