Hotdry.
systems

本地优先文件系统版本控制:Unfudged 通过钩子捕获任意工具变化

Unfudged (UNF) 使用文件系统钩子实时记录文本文件每秒变化,支持离线 diffs 和精确恢复。提供工程化参数、监控阈值与 AI 代理回滚清单。

在 AI 代理频繁改动代码的时代,传统 Git 版本控制已显不足:它依赖手动 commit,无法捕获编辑器、代理或脚本间的细粒度变化,导致 “AI 炸了项目却无处回滚” 的窘境。本地优先(local-first)文件系统版本控制应运而生,以 Unfudged(简称 UNF)为代表,通过底层文件系统钩子自动记录一切可见变化,实现任意秒级 rewind,无需任何 VCS 干预。这种方案的核心观点是:如果文件系统看到了变化,它就必须被版本化,从而为离线 diffs、多工具协作提供坚实基础。

UNF 的机制高度工程化,针对 macOS 使用 FSEvents API、Linux 使用 inotify,这些钩子以事件驱动方式捕获文件修改、创建、删除事件,仅针对文本文件(通过 magic number 过滤二进制),并应用 3 秒智能 debounce 避免高频噪声。“UNF 通过 FSEvents/inotify 实现 <1% CPU 占用”,这得益于事件过滤与批量处理,避免轮询开销。每变化触发 BLAKE3 内容哈希计算,形成内容寻址存储(dedup 相同内容),元数据存于 SQLite 数据库,确保 ACID 事务与崩溃恢复。存储路径统一在~/.unfudged/,不污染项目目录,支持多项目隔离。

落地时,首先安装 CLI 或 App:brew install cyrusradfar/unf/unfudged(包含 Tauri 桌面 GUI)。启动 unf watch,即进入监控模式,默认递归扫描当前目录,尊重 .gitignore。关键参数包括:

  • 监控范围:--project /path/to/repo 指定任意目录;全局多目录用 unf list 查看。
  • Debounce 阈值:默认 3s,可通过配置微调(源码中硬编码,但可 fork 调整),适用于高频编辑场景如 vim + AI 补全。
  • 文件过滤:文本 only,自动 skip .jpg 等;自定义 glob 如 --include '.rs' 用于日志查询。
  • 存储保留:自动衰减策略 ——24h 全快照、7 天 hourly、30 天 daily;手动 prune 清理旧数据,阈值建议:保留 >1GB 时 prune。

恢复与 diffs 是 UNF 的杀手锏,支持相对时间(如 5m、1h、2d)或 ISO 8601 绝对时间。典型命令清单:

  1. 日志查询:unf log src/main.rs --since 30m 显示时间线 + diffstat(+89 -67 行)。
  2. 点时间查看:unf cat .env --at 14:32:07 查看历史内容,便于 grep 已删文件。
  3. Diff 对比:unf diff --at "5m" 或 diff <(unf cat file --at 1h) <(unf cat file --at now)。
  4. 批量恢复:unf restore --at 14:32:07 -y(-y 确认),支持 --dry-run 预览影响文件数。
  5. 会话 recap:unf recap 输出 “Session: 2h 14m | 847 snapshots | 132 files”,自动检测 AI burst(如 47 文件 refactor)。
  6. 全局 stats:unf status /unf log --global --since 8h,监控 overnight AI 行为。

在 AI 代理场景下,UNF 提供标准化回滚策略:

  • Pre-AI 安全点:运行前 unf recap --json 记录 baseline,post-AI 比对 diff --session。
  • Burst 检测:recap 自动标记 “AI Bursts: 2 detected”,阈值自定义为 >10 文件 / 1min。
  • 监控指标:Prometheus 集成(--json 输出)——snapshots/hour、storage GB、restore latency <100ms。告警阈值:CPU>2%、storage >10GB/project。
  • 回滚清单
    场景 命令 参数阈值
    AI 删 .env unf restore .env --at 5m 影响 1 文件
    Mass refactor 47 files unf restore --at 10m --dry-run 先验览
    Cargo.lock 破坏 unf diff Cargo.lock @ 6:33 PM 仅 restore 该文件
    Overnight 80 files unf log --global --stats prune 前 backup

风险与 limits:一是单机 local-only,无内置 CRDT/multi-device sync(可扩展 Yjs/Automerge 层);二是高写负载项目需调高 debounce 至 5s,避免 SQLite 瓶颈。优化建议:结合 Git hooks,在 commit 前 auto-recap;或 Docker 卷挂载下 watch /workspace。相比 Time Machine(hourly),UNF 的秒级粒度更适开发;相较 Git,零 commit 摩擦。

实际测试中,UNF 在 Rust 项目中捕获 Cursor AI 的 132 次改动,restore 耗时 <1s,证明其生产就绪。未来,可 hook 到 LSP 或 VSCode extension,实现 editor-level diffs。

资料来源:

查看归档