多数のHunkで大きなファイルにパッチを適用する
大きなファイルに多数のHunkが分散するパッチを適用します。パッチエンジンのオフセット累積処理とパフォーマンスの考慮事項を理解します。
Multi-Hunk Patches
詳細な説明
大規模パッチの処理
大きなファイルと数十のHunkを含むパッチを扱う場合、パッチエンジンの処理方法を理解することが失敗のデバッグに重要です。
Hunkの処理方法
パッチエンジンはHunkを上から下へ順次処理します:
Offset = 0
各Hunkについて順番に:
1. 対象行 = hunk.oldStart + offset
2. 対象位置でコンテキスト行の一致を検証
3. 一致:Hunkを適用、オフセットを更新
4. 不一致:ファジーマッチング(±3行)を試行
5. それでも不一致:失敗を報告、Hunkをスキップ
オフセット累積の例
500行のファイルと5つのHunkのパッチの場合:
| Hunk | 対象 | 追加行 | 削除行 | 差分 | 累積オフセット |
|---|---|---|---|---|---|
| 1 | 10行目 | 3 | 1 | +2 | +2 |
| 2 | 50行目 | 0 | 5 | -5 | -3 |
| 3 | 100行目 | 2 | 2 | 0 | -3 |
| 4 | 200行目 | 10 | 0 | +10 | +7 |
| 5 | 400行目 | 1 | 3 | -2 | +5 |
Hunk 5の変更後ファイルでの実際の対象は400 + 5 = 405行目(すべての前の変更を考慮)。
パフォーマンスについて
Diffパッチ適用ツールはパッチをすべてブラウザ内で処理します。一般的なコードファイル(最大10,000行)で最大100 Hunkのパッチなら、処理はほぼ瞬時です。
デバッグのヒント
大規模パッチでHunkが失敗した場合:
- Hunkリストで成功と失敗を確認
- 失敗したHunkはパッチ作成後にファイルが変更されたことを意味する場合が多い
- 逆適用を試す — 新旧ファイルが逆になっている可能性
ユースケース
50以上のHunkを含む大規模設定ファイルのバージョンアップパッチを適用する必要があります。選択的Hunk機能で、適用に失敗したものを特定して対処できます。