パッチをあてる(その3:patchコマンドの-pオプションについて)

パッチをあてる(その3:patchコマンドの-pオプションについて)

Posted at February 17,2006 11:51 PM
Tag:[patch, Windows]

パッチをあてる」シリーズの第3回です。
サイトを検索すると、patch コマンド実行時に

C:¥work>patch -p0 < patch.txt

と青色の "-p0" を付与しているサンプルが一般的のようですが、この -pnumber というオプションの意味を調査・実験してみました。

このオプションはパッチファイルに記述されたディレクトリを無視する階層を示すものです。例えばパッチファイルの1?2行目の青色部分が

--- lib/MT/Util.pm.bak Fri Jan 06 14:19:44 2006
+++ lib/MT/Util.pm     Fri Jan 06 14:20:48 2006
@@ -401,7 +401,7 @@
     $str ||= '';
     my @paras = split /\r?\n\r?\n/, $str;
     for my $p (@paras) {
-        if ($p !~ m@^</?(?:h1|h2|h3|h4|h5|h6|table|ol|dl|ul|menu|dir|p|pre|center|form|fieldset|select|blockquote|address|div|hr)@) {
+        if ($p !~ m@^</?(?:h1|h2|h3|h4|h5|h6|menu|dir|p|pre|center|form|fieldset|select|address|div|hr)@) {
             $p =~ s!\r?\n!<br />\n!g;
             $p = "<p>$p</p>";
         }

と、ディレクトリが記述されており、パッチをあてる対象のファイル(ここでは Util.pm)がカレントディレクトリに配置されている場合、パッチをあてるコマンドは

C:¥work>patch -p2 < patch.txt

と "-p2" を設定します。
解説すると、上記の例は「パッチファイルに記述されたディレクトリを2階層分無視して、カレントディレクトリ(の Util.pm)にパッチをあてよ」という指定をしている訳です。

つまり、最初の "-p0" というオプションは「ディレクトリを無視しない」という意味になります。上記のパッチファイルを Movable Type のいわゆる CGIPath に配置し、"-p0" を付与して patch コマンドを実行すると正常に行われる、という訳です。

逆にパッチで記述されたディレクトリに該当ファイルが存在しない状態で "-p0" オプションを付与してコマンドを実行すると、

C:¥work>patch -p0 < patch.txt
can't find file to patch at input line 3
Perhaps you should have used the -p or --strip option?
The text leading up to this was:
--------------------------
|--- lib/MT/Util.pm.bak Fri Feb 17 23:19:44 2006
|+++ lib/MT/Util.pm     Fri Feb 17 23:20:48 2006
--------------------------
File to patch:

というメッセージが表示されますのでご注意ください。

また、-p オプションを付与しない場合、パッチファイルに記述されているディレクトリが全て無視されてファイル名だけが対象となりました。したがってカレントディレクトリにファイルを置いている場合は -p オプションを付与する必要がないということになります。

パッチファイルにディレクトリの指定がないのに、"-p2" とかつけて実行すると下記のようなメッセージが出力されます。

C:¥work>patch -p2 < patch.txt
missing header for unified diff at line 3 of 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:
--------------------------
|--- Util.pm.bak Fri Feb 17 23:19:44 2006
|+++ Util.pm     Fri Feb 17 23:20:48 2006
--------------------------
File to patch:

上記の内容を整理すると、patch コマンドにおける -p オプションの適用方法は下記のようになります。

 パッチをあてるファイル
カレントディレクトリにあるパッチファイルに記述された
ディレクトリにある
パッチファイルディレクトリ
記述あり
-pnumber または不要
numberは無視する階層数)
-p0
ディレクトリ
記述なし
不要
(-p0をつけても問題なし)

-pnumber オプションの代わりに --strip=number でも同じ効果があります。

C:¥work>patch --strip=0 < patch.txt

こちらの方が直感的に分かりやすそうです。

その1:適用方法
その2:パッチを作る
その3:patchコマンドの-pオプションについて
関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)