
2026/11/01 22:02
Show HN:OmniDiff – Rust で実装されたオープンソースで超高速なコンテキスト認識型 Git 比較ツール
RSS: https://news.ycombinator.com/rss
要約▶
日本語翻訳:
OmniDiff は、画像、フォント、アーカイブ、PDF などコードおよび非テキストファイルも堅牢に処理できる高速なコンテントウェアアウェアな差分ツールです。樹形座標器(tree-sitter)文法による構造化パースを介して C、C++、Go、Rust、Python、JavaScript、TypeScript といった 25 語以上に対応し、バイナリ形式に対してはピクセルレベルの解析を行います。標準ハードウェア(通常 p50 は 4.2ms)での中位パフォーマンスは 100ms 未満を実現します。正確性テストでは主要な全テストケースでゼロバイトの不一致が確認され、パフォーマンスも目標を一貫して満たしています(テストされたハードウェアでの p99 は約 177ms)。ユーザーはプレビルトバイナリまたはソースからインストールでき、主要なパッケージマネージャー(Homebrew、Debian/Ubuntu apt、Nix、Arch、Gentoo)、Git、および
jj と統合されます。また、VS Code(将来的な API アップデート後にインタラクティブな差分がサポート予定)と Neovim にも対応しています。本プロジェクトは AGPLv3 ライセンスですが、ソースコードの開示を回避する必要がある組織向けに商業サブスクリプションも提供します。今後のアップデートでは VS Code との統合をさらに拡大する予定です。本文
OmniDiff:高速・堅牢かつ正確な差異検出ツール
OmniDiff は、99.95% のコード変更を検出できる高品質な内容認識型の差異検出ツールです。
基本特性
- 高速: 100ms 未満で完了(中位値)
- 堅牢: コードの変更の 99.95% を検出可能
- 正確:
- 変更箇所の 98.8% は、内容特化アルゴリズムを使用して検出されます。
- PDF などでは完全一致/ほぼ完全一致を達成しています。
対応対象と性能(概算)
| カテゴリ | 速度 (相対値) | 正確性 | 堅牢性 |
|---|---|---|---|
| コード | 98% | 70% | 92% |
| 画像 | 96% | 69% | 91% |
| カーソル | 100% | 85% | 100% |
| フォント | 95% | 82% | 100% |
| アーカイブ | 88% | 87% | 87% |
| メッセージカタログ | 100% | 83% | 83% |
| 57% | 100% | 100% |
※測定環境: 32GB RAM搭載の T14s (Intel Core i7-1370P) 上で実施。(詳細はリポジトリ参照) ※注意: PDF の判定テストケース数は 10 件未満です。
インストール方法
ソースコードからビルド
C コンパイラと Rust ツールチェーン (
rustc 1.92 以降) が必要です。
cargo install --locked omnidiff
- 初回ビルド: tree-sitter グラムマタの C コンパイルと LTO の脂肪リリースプロファイル処理により数分かかります。
プリビルトバイナリ
Linux、macOS (Intel/Apple Silicon)、Windows 用は GitHub リリース に添付されています。
Homebrew (macOS/Linux)
brew install ivankovic/omnidiff/omnidiff
Debian と Ubuntu
.deb パッケージは署名済みの apt リポジトリから入手可能です。
# キーリング登録 sudo install -d -m 0755 /etc/apt/keyrings curl -fsSL https://ivankovic.github.io/omnidiff/apt/omnidiff-archive-keyring.gpg \ | sudo tee /etc/apt/keyrings/omnidiff-archive-keyring.gpg > /dev/null # リポジトリ追加 echo "deb [signed-by=/etc/apt/keyrings/omnidiff-archive-keyring.gpg] \ https://ivankovic.github.io/omnidiff/apt stable main" \ | sudo tee /etc/apt/sources.list.d/omnidiff.list > /dev/null # インストール sudo apt update && sudo apt install omnidiff
Nix および NixOS
nix run github:ivankovic/omnidiff
- ** flakes 有効化が必要な場合**:
を追加してください。--extra-experimental-features 'nix-command flakes'
Arch と Gentoo
ディレクトリにレシピあり。packaging/- Arch:
でPKGBUILD
。makepkg -si - Gentoo: ebuild は Overlay 即用。
- 注意: 両者のパッケージ受入れサイクルは不規則です。
エディタとの連携
VS Code
- 拡張機能名:
omnidiff-vscode - インストールコマンド:
code --install-extension ivankovic.omnidiff - Open VSX (VSCodium, Cursor, Windsurf 対応) でも利用可能。
- 注: 埋め込みの差分表示ビューを置換する機能は未提供(上流プロジェクト開発中)。
Neovim
- プラグイン名:
omnidiff.nvim
コマンドラインでの使い方
インタラクティブ TUI(ターミナルユーザーインターフェース)
# 空のビューアを開く(o を押してファイル指定) omnidiff # 2 つのファイルを直接差分表示 omnidiff BEFORE AFTER
- キーボード操作:
で一覧を表示。? - カラー:
の場合、24 ビットカラーを使用(デフォルト)。COLORTERM=truecolor
ブラウザ上での使用
- コマンド:
codereview- 注意: 現在 v0.0.0 ベータ版です。ご自身の責任で使用してください。
Headless モード / バッチ処理
omnidiff --headless BEFORE AFTER # または omnidiff --batch BEFORE AFTER
- 機能: TUI を開かず、差分をプレーンテキストで出力(スクリプト・CI向け)。
- 自動発動: 標準出力がターミナルでない場合(
やファイルリダイレクト)は自動的に発動。| less - 折りたたみ: デフォルトでは変更の両側にコンテキスト 3 行を表示(
で変更可能)。大きなファイル内の関数定義などをプレフィックスに追加。--context N - カラー制御:
- デフォルト:カラー有効
- ANSI カラー無効:
または環境変数--color neverNO_COLOR=1
終了コード
- 成功 (0): 正常終了
- エラー (2): エラー発生
- ファイル違い (1):
- デフォルトでは 0 を返す(バージョン管理システムとの親和性のため)。
- スクリプト用途で「違いを検知」したい場合:
フラグを指定。--exit-code
JSON 出力
omnidiff --mode json BEFORE AFTER
- 差分を 1 つの JSON オブジェクトとして出力(スキーマは
)。src/tui/json_output.schema.json
Git との連携
OmniDiff は
git difftool のバックエンドとして動作します。
構成設定 (手動)
# コマンド登録 git config difftool.omnidiff.cmd 'omnidiff "$LOCAL" "$REMOTE"' # 使用開始 git difftool --tool=omnidiff # デフォルトツールの指定 git config diff.tool omnidiff # プロンプト無効化(確認ダイアログを抑制) git config difftool.prompt false
Git 動作の補足
: インタラクティブ TUI を開く。git difftool
/git diff
: インタラクティブ TUI を開かず、TUI は非互換なパイプ出力となるためプレーンテキストフォールバック(Headless モード)へ。git log -p- インタラクティブ利用には必ず
を使用してください。git difftool
- インタラクティブ利用には必ず
- 外部差分ツールとして:
GIT_EXTERNAL_DIFF=omnidiff git diff
Jujutsu (jj) との連携
jj は独自の設定が必要です。
# 登録とデフォルト設定 jj config set --user merge-tools.omnidiff.program omnidiff jj config set --user merge-tools.omnidiff.diff-args '["$left","$right"]' jj config set --user merge-tools.omnidiff.diff-invocation-mode file-by-file # デフォルトフォーマッターへ jj config set --user ui.diff-formatter omnidiff
は必須です(ファイルごとの処理のため)。diff-invocation-mode = "file-by-file"- 全画面 TUI:
のみ非インタラクティブテキスト表示。jj diff
相当の機能はありません。jj difftool
対応するコンテンツ
構造的言語 (tree-sitter グラムマタ)
以下 25 の言語は構造的に解析され、高精度な差分検出が行われます:
| カテゴリ | ファイル拡張子 |
|---|---|
| C | , |
| C# | |
| C++ | , , , , , |
| CSS | , |
| Go | |
| HTML | , |
| Java | |
| JavaScript | , , , |
| JSON | |
| Kotlin | |
| Lua | |
| Perl | , |
| PHP | |
| Python | , , |
| R | |
| Ruby | |
| Rust | |
| Scala | |
| Shell | , |
| Swift | |
| TSX | |
| TypeScript | , , |
| Vimscript | |
| XML | , , , など多数 (詳細はドキュメント参照) |
| YAML | , |
※グラマタ未使用の言語: Bazel, Dart, Emacs Lisp, Markdown, Protocol Buffers, SQL などは拡張子から認識されますが、構造的差分ではなくテキストベースで検出されます。
バイナリコンテンツ
ファイル名ではなく内容に基づいて差異を判定します。
| コンテンツ | フォーマット | 検出方式 |
|---|---|---|
| 画像 | PNG, JPEG, GIF, WebP, BMP, ICO, TIFF | ピクセル単位(アニメーションはフレームごと) |
| アーカイブ | ZIP, TAR, GZ, XZ など、JAR/Office 含む | ファイルごと・中身ベース |
| フォント | TTF, OTF, WOFF, EOT など | グリフ単位(フォント名・メトリクス含む) |
| カーソル | CUR, ANI, X cursors, HLC | サイズ・フレームごと |
| メッセージカタログ | MO, QM | メッセージごと |
| ページごと(各ページを描画して比較) |
変更の分類
- 不可視: バイトのみが異なっている。
- 不可知: コンテンツの意味が不明確な変更。
- アーティファクト: 圧縮や再サンプリングによる変化。
- 編集済み / 再描画 / 置換: テキスト、空白、書式化などの具体的な変更。
画像表示について: TUI 内では
kitty, sixel, iterm2 プロトコルに対応します。Unicode ハーフブロックと全角ブロックの切り替えは b キーまたは OMNIDIFF_GRAPHICS=halfblocks で制御可能です。
ライセンス
- GPL-3.0+ (AGPL): 自由ソフトウェア。ソースコード公開義務あり。
- 商業ライセンス: GitHub Sponsors 経由で月額サブスクリプション提供可能(内部利用向け、ソース公開義務なし)。詳細は
を参照。LICENSE-COMMERCIAL
開発ガイドラインとポリシー
AI ポリシー
- 現在、Claude Code の大幅な AI アシスタンスを受けています。
- コミット履歴には事実を隠さず Co-Authored-By とリンクを含みます。
- AI 支援によるコントリビューションも同等に歓迎されますが、理解とサポートの責任は提出者にあります。
パフォーマンス目標(達成済み)
- 速度: メジアン(p50)100ms、90% 分位(p90)1000ms を目標達成。
- コード測定結果: p50=4.2ms, p90=35.1ms, p99=177ms。
堅牢性の測定結果
- コード: 約 44 万ペアのうち 99.95% (442,322 ペア) が正常終了。
- 失敗要因:予算超過(96 ペア)、メモリ制限超過(112 ペア)。
- 多様コンテンツ: テキスト・コンテンツを含め全体の 98.8% を検出可能。
正確性の測定結果
- コード: 0 バイト不一致のテストケース 90%, 最大 1% 不一致のテストケース 99%.
- 全体コーパスでの不一致は 0.14%(
モード)、0.07%(--full
モード)まで改善。--minimal
- 全体コーパスでの不一致は 0.14%(
- 多様コンテンツ:
- 画像:ほぼ完全一致 91%
- カーソル:完全一致 100%
貢献者向け情報
詳細は
CONTRIBUTING.md および AI エージェント用の AGENTS.md を参照してください。