标准的版本控制工具通常在行级别处理更改;如果 100 个字符的行中只有一个字符发生变化,整行都会被标记为已替换。OmniDiff 旨在通过提供“内容感知”的差异对比来解决这一问题。该工具使用 Rust 开发,并根据所对比的文件类型使用专门的算法来识别确切的变动。例如,在对比源代码时,它可以区分简单的变量重命名和复杂的逻辑更改,仅突出相关的片段,而不是重新绘制整个文本块。

一个并排对比动画,显示 GNU diff 将整行标记为更改,而 OmniDiff 仅突出显示特定的代码片段。
一个动画,对比标准基于行的差异对比与 OmniDiff 在 Python 重构中的内容感知方法。github.com

动画演示了 OmniDiff 如何识别特定的逻辑更改和移动的变量,而不是重新绘制整个文本块。

该工具通过与 Tree-sitter 语法集成来实现其准确性,用于对包括 C++、Go、Java、Python 和 Rust 在内的许多编程语言进行结构分析。除了源代码外,OmniDiff 还通过分析内部结构来处理二进制格式。它可以为图片(PNG、JPEG)提供像素级的对比,为 Web 字体(WOFF2、TrueType)提供字形级的对比,并为 PDF 文档提供逐页分解。根据开发者在配备 Intel Core i7 处理器的笔记本电脑上进行的基准测试,该工具保持了高性能,在超过 2,300 个测试固件中实现了低于 100ms 的中位差异对比时间。

一个动画显示 OmniDiff 在 Font Awesome Web 字体文件中识别出 21 个更改的字形。
OmniDiff 为 Web 字体提供字形级的对比,识别出标准工具遗漏的特定更改。github.com

此视觉效果展示了该工具通过分析内部结构处理 WOFF2 等二进制格式的能力。

一个动画显示 OmniDiff 在 PDF 文档中识别元数据和页面级更改。
OmniDiff 为 PDF 文档提供逐页分解,突出显示特定的修改元素。github.com

这展示了该工具除了简单的二进制标记外,还能为 PDF 文档提供结构分析的能力。

OmniDiff 可以直接集成到 Git 和 Jujutsu (jj) 等常见版本控制工作流中,既作为 `difftool` 后端,也作为格式化程序。虽然它提供支持 24 位颜色和 Kitty 或 Sixel 等图形协议的终端用户界面 (TUI),但它也提供用于 CI/CD 流水线的无头模式,以及用于程序化使用的 JSON 输出。其许可方面存在一个显著的权衡:虽然它在 GNU Affero General Public License (AGPL) 下发布以鼓励开放协作,但这可能为一些偏好 BSD 或 MIT 等更宽松许可证的企业用户带来障碍。因此,该项目为寻求规避 AGPL 源代码披露要求的组织提供商业许可层级。

OmniDiff 终端用户界面的截图,显示 Python 重构的双面板视图。
OmniDiff 终端用户界面 (TUI) 在浅色主题下突出显示特定的代码更改。github.com

截图展示了支持 24 位颜色和图形协议的终端用户界面。