返回

文章详情

裂缝:更好的 Git 工作树替代品

Hacker News2026年6月1日 06:53

rift:更好的 Git 工作树的写时复制(节省空间)瞬时 (< 0.1s 在 10GB 文件夹上) 快速 CLI 用作 FFI 库,使用 bun 或 node 目前支持 mac 和 linux+btrfs,更多支持即将到来 安装 npm install -g rift-snapshot # 或 bun add -g rift-snapshot 发布档案可从 GitHub Releases 获得。平台 平台 后端 行为 Linux x64 可写的 btrfs 快照 rift init 将普通目录转换为 btrfs 子卷。macOS arm64 / x64 APFS clonefile rift init 注册源目录。Windows x64 无 此包已发布;工作区创建尚未实现。CLI 初始化 cd ~ /code/app rift init rift init 选择当前目录上方的现有 Rift 根目录,或者在没有 Rift 根目录时选择最近的 Git 根目录。使用 --here 确切地初始化选定的目录。在 Linux 上,首次初始化普通 btrfs 目录执行 reflink 导入到新的 btrfs 子卷并交换到相同路径。如果选定的根目录已经被注册,则不进行转换。如果缺少 .rift 标记,rift init 会恢复它并完成任何所需的转换。创建 rift create rift create --name parser-fix rift create --into /fast/rifts rift create 向上搜索 .rift,复制该管理工作区,记录直接父目录,并将新工作区路径打印到标准输出。在 Linux 上,它创建一个可写的 btrfs 快照。在 macOS 上,它使用 APFS clonefile。当工作区是一个 Git 存储库时,新工作区具有分离的 HEAD,并保留索引和工作树状态。列出和祖先 rift list rift ancestors list 打印直接活动子工作区。ancestors 打印父工作区,最近的优先。删除和垃圾回收 rift remove # 垃圾当前创建的 rift 子树 rift remove -f ~ /code/app # 取消注册源根目录 rift remove --children ~ /code/app # 垃圾后代,保留选定的工作区 rift gc # 物理删除垃圾并修剪丢失条目 删除创建的 rift 会将其活动子树移动到相邻的 .trash 存储区。rift gc 稍后删除该存储区。删除源根目录在 CLI 中需要使用 -f。源目录保留在磁盘上,.rift 标记被移除。现有的注册后代被移动到垃圾区。丢失的后代从注册表中删除。Shell 集成 eval "$(rift shell-init zsh)" # 或 bash Shell 包装器在 init 转换、创建或删除当前创建的 rift 后更改目录。存储 每个管理的工作区都有一个包含其标识符的 .rift 标记。SQLite 注册表存储路径、父标识符和垃圾条目。默认创建工作区存储位于注册源根目录的相邻位置:~/code/app/ 源工作区 ~/code/.rifts/app/parser-fix/ 创建的工作区 ~/code/.rifts/app/.trash/ 删除的工作区存储 JavaScript API 该包通过条件导出选择 Bun 或 Node FFI 绑定。 import { create, list, remove, gc } from "rift-snapshot"; const workspace = create({ from: process.cwd(), name: "schema-work" }); console.log(list({ of: process.cwd() })); remove({ at: workspace }); gc(); Node.js Node 绑定需要在 Node.js 26.1 或更高版本中实验性的 FFI API: node --experimental-ffi app.mjs 在 Node 的权限模型中,还需传递 --allow-ffi。函数 init (options ?: { at ?: string; database ?: string }): null create (options ?: { from ?: string; name ?: string; into ?: string; database ?: string }): string remove (options ?: { at ?: string; all ?: false; database ?: string }): void remove (options: { at ?: string; all: true; database?: string }): string[] list (options ?: { of ?: string; database ?: string }): string[] ancestors (options ?: { of ?: string; database ?: string }): string[] gc (options ?: { database ?: string }): string[] JavaScript init 函数在 ; Git 根选择和 --here 均与 CLI 行为完全一致。操作失败时抛出 RiftError,包含代码和(如适用)路径。开发 cargo test --workspace --locked ./scripts/install.sh scripts/install.sh 安装优化后的 CLI 二进制文件到 ${CARGO_HOME:-$HOME/.cargo}/bin/rift。许可证 MIT

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡