すべてを

▼開く

閉じる▲

ソースファイルにパッチを当てる

○LHAのソース「lha-114i」にパッチ「lha-114i-sec.patch」を当てる

lsコマンドでパッチを当てるディレクトリとファイルを見る
$ ls -lr
drwxr-xr-x  4 1000 1000   4096 12月 15  2000 lha-114i
-rw-r--r--  1 root root   1775  5月  6 01:24 lha-114i-sec.patch

patchコマンドで-p0オプション、リダイレクトでファイルを指定する
$ patch -p0 < lha-114i-sec.patch
patching file lha-114i/src/header.c
patching file lha-114i/src/lhext.c

patchコマンドで-p0オプションを指定し、リダイレクト「<」でpatchコマンドにパッチファイル「lha-114i-sec.patch」を与える。すると、ディレクトリ「lha-114i/src/」にあるファイル「header.c」と「lhext.c」にパッチが当てられる。

patchコマンドを実行する場所

patchコマンドを実行する時は、パッチファイルを置くディレクトリ、対象ファイルを置くディレクトリとコマンドを実行するディレクトリに注意する。

パッチファイルの先頭にあるファイルの情報を見ると、パッチを当てる対象のファイルがあるディレクトリが判る。patchコマンドはこの情報を元にパッチを当てるので、対象となるファイルの場所がpatchコマンドを実行しているディレクトリから見える場所でなくてはならない。

--- lha-114i/src/header.c.orig  2000-10-05 19:36:03.000000000 +0200
+++ lha-114i/src/header.c       2004-04-21 14:30:52.000000000 +0200

具体的に言うと、パッチ対象のファイルが「lha-114i/src/header.c」であった場合、パッチファイルは「lha-114i」と同じディレクトリ(lsコマンドで「lha-114i」が表示されるディレクトリ)に置いて、そのディレクトリでpatchコマンドを実行する。この時のオプションは-p0で、パス名を除去しないことを意味する。

パッチファイルを「src」と同じディレクトリ(lsコマンドで「src」が表示されるディレクトリ)に置いて、そのディレクトリでpatchコマンドを実行する場合、オプションを-p1に指定する。これにより、パス名の中の「/」が1つ除去されて「src/header.c」になり、ディレクトリ「src」の下にあるファイルにパッチを当てることができる。

パッチファイルをパッチの対象ファイルと同じディレクトリ(lsコマンドで「header.c」が表示されるディレクトリ)に置いて、そのディレクトリでpatchコマンドを実行する場合、オプションを-p2に指定する。あるいは、この-pオプションをなしにする。これにより、パス名の中の「/」が2つ除去されて「header.c」になり、ファイルにパッチを当てることができる。

オプション パス名
-p0 lha-114i/src/header.c
-p1 src/header.c
-p2
または
オプションなし
header.c

●パッチを当てるファイルが見つからない場合

パッチを当てる対象ファイルが見つからない場合、「File to patch:」とどのファイルにパッチを当てるか尋ねてくる。そこにファイルがあるディレクトリを入力すると、パッチが当てられる。


パッチを当てない場合は、そこでリターンを押す。次に表示される「Skip this patch? [y] 」で「y」を入力してリターンを押すと、パッチをスキップする。
$ patch -p0  < lha-114i-sec.patch
can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|--- lha-114i/src/header.c.orig 2000-10-05 19:36:03.000000000 +0200
|+++ lha-114i/src/header.c      2004-04-21 14:30:52.000000000 +0200
--------------------------
File to patch:
Skip this patch? [y] y
Skipping patch.
2 out of 2 hunks ignored
can't find file to patch at input line 27
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|--- lha-114i/src/lhext.c.orig  2000-10-04 16:57:38.000000000 +0200
|+++ lha-114i/src/lhext.c       2004-04-21 14:30:52.000000000 +0200
--------------------------
File to patch:
Skip this patch? [y] y
Skipping patch.
2 out of 2 hunks ignored

●既にパッチが当たっている場合

既にパッチが当たっている場合、リバースパッチになるため以下のメッセージがでる。

$ patch -p0 < lha-114i-sec.patch
patching file lha-114i/src/header.c
Reversed (or previously applied) patch detected!  Assume -R? [n] n
Apply anyway? [n] n
Skipping patch.
2 out of 2 hunks ignored -- saving rejects to file lha-114i/src/header.c.rej
patching file lha-114i/src/lhext.c
Reversed (or previously applied) patch detected!  Assume -R? [n] n
Apply anyway? [n] n
Skipping patch.
2 out of 2 hunks ignored -- saving rejects to file lha-114i/src/lhext.c.rej

リバースパッチ(パッチを当てる前の状態に戻す)を当てるかどうか、指示をする。

Reversed (or previously applied) patch detected!
リバース(あるいはパッチ済み)パッチが検知されました。
Assume -R? [n]
-Rオプションを適用しますか? [n]
リターンを押すと適用しない。
-Rオプションを適用してリバースパッチを当てる場合は「y」[return]を押す。
Apply anyway? [n]
どうしても当てますか? 
パッチを当てない場合はそのまま[return]を押す。
パッチを当てる場合は「y」[return]を押す。
Skipping patch.
パッチをとばします。
2 out of 2 hunks ignored -- saving rejects to file lha-114i/src/header.c.rej
2つの内の2つを無視します--パッチが当てられなかった部分をlha-114i/src/header.c.rejに保存します。