@lukeed05:介绍 `lane` —— 一个用于管理:写时复制(CoW)工作树、持久化项目内记忆的 CLI 工具。普通工作树会……

X AI KOLs Timeline 工具

摘要

介绍 `lane`,一个使用写时复制创建高效 Git 工作树的 CLI 工具,具有持久化项目内记忆,防止不必要的重建并支持并行开发。

介绍 `lane` —— 一个用于管理的 CLI 工具: 写时复制(CoW)工作树 持久化项目内记忆 普通工作树会丢弃所有让检出快速的被忽略文件:node_modules、target/、.env 文件等。因此,即使缓存已在磁盘上,你仍需重新安装和重建。 lane 通过引用克隆它们。 lane 还管理项目记忆。 将注释附加到文件和符号: $ lane note add src/auth.rs -a 'fn verify' 'must stay constant-time' # 或 $ git commit -am "fix(auth): prevent timing attach \ Why: src/auth.rs#fn verify | early return leaks token length" 当 `fn verify` 发生变化时,注释会被标记。它会保持标记状态,直到有人解决它。一个自信的错误注释比没有注释更糟。 lane 足够轻量,可以同时运行多个,因此并行代理各自拥有自己的树和注释。每个注释都是一个单独的文件,因此多个代理可以注释同一个函数而不会冲突。 lane 从不调用模型。 GitHub: https://github.com/lukeed/lane 文档: https://lane.lukeed.com
查看原文
查看缓存全文

缓存时间: 2026/08/28 01:45

介绍 lane — 一款用于管理:写时复制(CoW)工作树、持久化项目记忆的命令行工具

普通工作树会丢弃所有让检出操作保持高速的忽略文件:node_modules、target/、.env 文件等。因此即使缓存已存在于磁盘上,你仍需重新安装和构建。而 lane 通过引用克隆这些文件。

lane 还能管理项目记忆。你可以为文件和符号附加注释:

$ lane note add src/auth.rs -a 'fn verify' '必须保持恒定时间'
# 或
$ git commit -am "fix(auth): 防止时序攻击
Why: src/auth.rs#fn verify | 提前返回会泄露令牌长度"

当 fn verify 发生变化时,该注释会被标记。标记将保留直到有人解决它。一个自信但错误的注释比没有注释更糟。

工作树可以低成本并行运行多个,因此并行代理可以各自拥有自己的工作树和独立注释。每个注释都是独立文件,多个代理可以注释同一函数而不会冲突。lane 从不调用模型。

GitHub: https://github.com/lukeed/lane
文档: https://lane.lukeed.com


lukeed/lane

来源: https://github.com/lukeed/lane

lane

CI 状态: https://github.com/lukeed/lane/actions/workflows/ci.yml

带记忆的写时复制 Git 工作树
Lane 创建隔离工作树,不会遗留那些让检出保持高速的被忽略构建缓存。它还能为文件或符号附加持久注释,并在相关代码变更时将其标记。Lane 从不调用模型。

为何需要另一个工作树工具?

当你运行 git worktree add 时,它会创建一个干净的检出,但会保留所有 Git 忽略的内容:target/、node_modules/、虚拟环境、生成文件和本地 .env 文件。这意味着你必须重新安装和/或从头构建,尽管所有缓存早已温暖地存在于磁盘上。

在支持反射链接(reflink)的文件系统上,lane 通过引用克隆这些条目。新的工作树初始即为“温热“状态,仅对修改的块分配新存储空间。

Lane 在 APFS 上使用 clonefile(2),在支持反射链接的 Linux 文件系统(包括启用 reflink 的 btrfs 和 XFS)上使用 FICLONE。如果反射链接不可用,lane 将创建普通工作树,且不会逐字节复制被忽略的缓存。需要时,lane new --dirty 也会携带已跟踪的编辑和未跟踪但非忽略的文件;若无反射链接,这些变更文件会被正常复制。

工作树存放在 .lane/trees/ 下,并通过 .git/info/exclude 排除,因此工作树本身永远不会被提交。

Lane 还能为文件或符号附加持久注释/记忆,并在相关代码变更时将其标记。Lane 从不调用模型。

安装

预编译二进制文件适用于 macOS 和 Linux 的 arm64 与 x86_64 架构:

$ curl -fsSL https://lane.lukeed.com | sh

安装脚本默认写入 ~/.local/bin。设置 LANE_INSTALL 以选择其他目录,或设置 LANE_VERSION 以固定特定版本。你也可以通过 Cargo 安装:

$ cargo binstall --git https://github.com/lukeed/lane lane
# 或
$ cargo install --git https://github.com/lukeed/lane

从源码构建需要 Rust 1.85 或更新版本。

设置

对于每个新终端,你需要安装 lane shellenv 包装器以自动 cd 进出 lane 工作目录。或者,你可以将 shell 包装器添加到 .zshrc 或 .bashrc 以自动运行:

eval "$(lane shellenv)"

虽然非必需,但这比手动反复运行 cd .lane/trees/ 更方便。

然后初始化每个仓库:

$ cd yourrepo
$ lane init
$ git add .lane AGENTS.md
$ git commit -m 'initialize lane'

这将创建记忆存储,在 AGENTS.md 中添加简短的代理协议,并报告文件系统是否支持反射链接。

可选工具可捕获 Why: 提交尾注或安装更完整的代理工作流:

$ lane install hooks  # 从提交中捕获目标 Why: 尾注
$ lane install skill  # 为编程代理安装更完整的工作流

用法

$ lane new fix-login
$ lane why src/auth.rs
$ lane note add src/auth.rs -a 'fn verify' \
    '必须保持恒定时间;提前返回会泄露令牌长度'
# 像平常一样编辑和提交
$ lane check
$ lane merge
# 或
$ lane push

lane new 在 .lane/trees/ 下创建一个分支和工作树。在 APFS、btrfs 和启用反射链接的 XFS 上,忽略的文件通过引用克隆。否则,Lane 创建普通 Git 工作树并跳过忽略的文件。

注释记录必须保持为真的内容,而非提交更改了什么。它们以 Markdown 形式存储在 .lane/memory/ 下,并锚定到声明、Markdown 标题、组件块或整个文件。

对于有保护分支的仓库,使用 lane push 而不是 lane merge。拉取请求合并后,运行 lane prune。

运行 lane --help 查看命令列表,或访问用法指南 (https://lane.lukeed.com/usage) 了解完整工作流。参见审计了解合并前如何审查现有记忆。

记忆

记忆是提交到仓库中的普通 Markdown:

.lane/
  memory/
    <repo>/<sha>.md   活跃注释和已确认指纹
  attic/
    <repo>/<sha>.md   已归档注释,仍可恢复
  trees/
    <name>            本地工作树,永不提交

新注释使用独立文件,因此并行 lane 可以注释同一代码而无需编辑相同字节。

lane note confirm <note> 通过更新其已确认指纹来重新确认一个漂移的注释。pin 和 unpin 同样更新保留元数据。

如果两个分支对同一注释做出冲突判断,Git 会使该分歧可见。

注释直接写入 .lane/memory/ 而无基线。下一次审计在 rebase 后设定基线,跟踪源文件重命名,并将被取代、未固定缺失或未固定超预算的注释移至 .lane/attic/ 而非删除。

锚点包括 fn verify 等声明、## Rate limiting 等 Markdown 标题、#script 等组件块,以及 @file 表示整个文件。

运行 lane anchors src/auth.rs 列出规范值及其行范围。唯一的裸名称(如 verify)存储为其规范值;同名但属于多种声明类型的名称会被拒绝并提供可用选择。注释和空白符会从指纹中标准化移除。

审计

运行 lane check 获取现有记忆的状态报告:

$ lane check

新鲜度是针对锚定范围计算的,而非整个文件:

结果含义
fresh锚定范围未更改
content-changed其实现已更改
contract-changed其声明已更改
anchor-missing符号不再可解析
unverifiablelane 没有该锚点的语法解析能力

通过以下操作之一解决漂移:

$ lane note confirm <note>   # 仍然有效
$ lane note replace <note> '' # 需要更新
$ lane note retire <note>     # 不再适用

运行 lane note edit <note> 可通过引导式终端菜单执行相同操作,包括固定或取消固定注释。

replace 继承活跃注释的路径和锚点。retire 和 restore 在活跃记忆和档案库之间移动未更改的字节;pin 和 unpin 控制驱逐策略。

对于新注释,提供的文本不会触发提示,若未指定 -a 则默认为 @file;省略文本将使用交互式锚点选择器和单行提示符。

开发

$ ./scripts/build.sh          # 发布构建并安装本地 lane 二进制文件
$ cargo fmt --all --check
$ cargo clippy --workspace --all-targets -- -D warnings
$ cargo test --workspace
$ ./scripts/test.sh           # 针对临时 Git 仓库进行端到端测试
$ ./scripts/check-linux.sh    # 在不支持反射链接的环境下运行相同检查
$ ./scripts/release.ts patch  # 提升版本号,然后打标签并推送发布

许可证

MIT © Luke Edwards (https://lukeed.com)

相似文章

使用 Git worktree 轻松实现并行开发

Hacker News Top

文章介绍了 Git 的 worktree 功能,该功能允许开发者在不同的目录中同时处理多个分支,从而提升并行开发任务的工作流程效率。

Rift:Git Worktrees 的更优替代方案

Hacker News Top

Rift 是一个命令行工具,提供比 Git worktrees 更好的替代方案,通过写时复制快照在 Linux 的 btrfs 和 macOS 的 APFS 上实现快速创建工作区。