10.3.3 patchによる不完全な一致の探索を助ける
コンテキスト diff、そして程度は劣りますが通常形式の diff でも、patchはパッチの行番号が誤っていることを検出して、各ハンクの正しい適用位置を探そうとします。まずハンクの行番号に、前のハンクで使ったオフセットを加減した位置を試します。そこが正しくなければ、patchは前後の両方向を走査して、ハンクに示されたコンテキストに一致する行の組を探します。
まずpatchはコンテキストの全行が一致する場所を探します。見つからず、入力がコンテキスト diff または統一形式 diff で、最大 fuzz 係数が1以上なら、patchはコンテキストの先頭と末尾の1行を無視して再走査します。それでも見つからず、最大 fuzz 係数が2以上なら、先頭と末尾の2行を無視して再走査します。最大 fuzz 係数がもっと大きければ、同様に続けます。
--fuzz=lines(-F lines)オプションは最大 fuzz 係数をlinesに設定します。このオプションはコンテキスト diff と統一形式 diff にのみ適用され、ハンクの適用位置を探すとき最大lines行を無視します。fuzz 係数が大きいほど誤った適用の可能性が高くなる点に注意してください。既定値は2です。差分のコンテキストの行数(通常3)を超える値に設定しても意味はありません。
patchがハンクの適用位置を見つけられない場合、そのハンクを拒否ファイルへ書き出します(命名方法は拒否ファイル名参照)。拒否したハンクは入力の形式によらずコンテキスト形式で書き出されます。入力が通常形式またはed diff なら、コンテキストの多くは単に空になります。拒否ファイルの行番号は、パッチファイルの行番号と異なる場合があります。これは旧ファイルの位置ではなく、patchが失敗したハンクを新ファイル内で置くべきだと考える、おおよその位置を示します。
--verboseオプションを指定すると、patchは各ハンクの処理を終えるたびに成功か失敗かを伝えます。失敗時には、新ファイルのどの行にハンクを置くべきだとpatchが考えるかも伝えます。差分に指定された行番号と異なれば、オフセットを伝えます。1回の大きなオフセットは、patchが誤った場所にハンクを適用したことを示すかもしれません。またpatchは照合に fuzz 係数を使った場合も伝え、この場合も少し疑って確認すべきです。
patchはedスクリプトの行番号のずれを判断できません。通常形式の diff でも、変更または削除コマンドに出会ったときしか誤った行番号を検出できません。コンテキスト diff でも、fuzz 係数がコンテキストの行数(通常3)以上なら同じ問題がありえます。このような場合は、元の入力ファイルとパッチ適用済みファイルとのコンテキスト diff を見て、変更が妥当か確認するとよいでしょう。エラーなしでコンパイルできることは、適用が成功したかなりよい目安ですが、保証ではありません。
空ファイルを対象とするパッチは存在しないファイルにも適用でき、その逆も同様です。ファイルの作成と削除を参照してください。
patchは多くの推測を要する場合でも通常は正しい結果を出します。ただし結果が保証されるのは、パッチの生成元ファイルと完全に同じコピーへ適用する場合だけです。