diffを利用したpatch適用と「hunk FAILED」「malformed patch」等の解決方法



スポンサードリンク

patchの適用方法

まずはバックアップを取っておきましょう。Linux上では次のコマンドで行います。

$ cp -a software-1.0 software-1.0.before-patch

patchを実行しましょう。次のようなコマンドになります。

$ patch -Np1 -d software-1.0 < fix-bug.patch

もし正常に動作すれば次のように出力されます。

$ patch -Np1 -d software-1.0 < fix-bug.patch
patching file bar.h
patching file quux.c
patching file foo.txt
$

上記以外のメッセージが表示される場合は「警告」もしくは「エラー」を意味します。その場合には正しくパッチが適用されていません。

「なぜ警告が表示されているのか?」「エラーの理由は何か?」を正しく理解しましょう。

代表的なエラー・警告内容

can't find file to patch at input line nnn. File to patch:

No file to patch. Skipping patch. n out of n hunks ignored.

正しいコマンドを入力しているか確認しましょう。

どこの行が問題箇所かは次のコマンドを入力すると教えくれます。

$ patch --dry-run -Np2 -d software-1.0 < fix-bug.patch

「-p0」のオプションを付加するのは間違っています。サブディレクトリを無視して、同じディレクトリの中にパッチを適用する全てのファイルが存在すると解釈されてしまいます。

エラーメッセージが発生する箇所を除いてパッチが正常に動作する場合は

Hunk #n FAILED at nnn. n out of n hunks FAILED -- saving rejects to file file.rej

パッチを適用する際のそれぞれの修正箇所の塊を「hunk」と呼びます。そのhunkが適用できなかったことをいみます。

もっとも簡単な確認は、次のように「--ignore-whitespace」をつけます。

$ patch -Np1 --ignore-whitespace -d software-1.0 < fix-bug.patch

仮にエラーが消えない場合には別の問題があります(そのパッチは別のバージョン向けなど)。

$ patch -Np1 -F3 -d software-1.0 < fix-bug.patch

Hunk #n succeeded at nnn (offset n lines)、Hunk #n succeeded at nnn with fuzz n

この表示は「パッチは適用できたが、パッチファイルで指定してある適用したい行とは異なる」という意味です。

この警告は一般的には問題ありません。しかし、patchがhunkを間違った場所に導入していることを示している可能性があります。

malformed patch at line nnn

このエラーが出る場合はパッチファイルが壊れています。もし「コピー&ペースト」によりエディタからパッチを作成した場合には注意が必要です。

「パッチファイル」は行の先頭に空白を含んでいます。「コピー&ペースト」によりパッチを作成した場合は先頭の空白が消えている場合があります。

また、サイトからパッチをダウンロードする場合にはブラウザのツールバーから「ファイル」→「保存」を利用してパッチを保存しましょう。

自分でパッチを作成する場合には、手動で作るのではなく「diff」コマンドを利用して次のように作成しましょう。

1. まず、オリジナルファイルをコピーします。

$ cp -a software-1.0 software-1.0.orig

2. 次に、「software-1.0」を修正してください。

3. 最後に、diffコマンドを利用して修正したファイルの差分を取得します。この際、そのままファイルに保存させましょう。

$ diff -Naur software-1.0.orig software-1.0 > fix-bug.patch

Reversed (or previously applied) patch detected! Skipping patch.

Reversed (or previously applied) patch detected! Assume -R? [n]

(Stripping trailing CRs from patch.)

これ以外のエラー内容

スポンサードリンク