私が知っている限り、patch
特定のパスコンポーネントが削除されると、アプリケーションパッチが許可されます。
-p0
パラメータはパスを処理しますが、現状のまま:
/var/www/html/example.com
-p1
ルートスラッシュが削除されるため、使用するパスは次のとおりです。
var/www/html/example.com
フルパスにパッチを適用するのではなく、ルートスラッシュ(またはパスの以前のコンポーネント)を削除するのはなぜですか?
相対パスを介してディレクトリツリーを深化させるロジックを見ることができますが、ほとんどの場合、それが実用的か有用かどうかはわかりません。
答え1
patch
これPOSIXユーティリティですこのオプションの使用例は、ユーティリティ標準仕様の理論的根拠セクションに記載されています-p
。
この
-p
オプションを使用すると、パッチファイルを手動で編集しなくても、ローカルユーザーディレクトリ構造に合わせてパッチファイルをカスタマイズできます。たとえば、パッチファイルのファイル名が次のような場合:/curds/whey/src/blurfl/blurfl.c
設定は
-p 0
変更されていないフルパス名を提供します-p 1
。curds/whey/src/blurfl/blurfl.c
プリアンブルなしで以下を
<slash>
提供-p 4
します。blurfl/blurfl.c
-p をまったく指定しない場合は、次のようになります。
blurfl.c
これOpenBSD マニュアルこれは役に立つかもしれませんが、少し拡張された例です-p
(強調)。
-p strip-count
、--strip strip-count
パッチファイル内のパス名の処理方法を制御するパス名の数を設定します。パッチの送信者とは異なるディレクトリにファイルを保存した場合。削除数は、パス名の前に削除するスラッシュの数を指定します。 (途中のすべてのディレクトリ名も消えます。)たとえば、パッチファイルのファイル名が次のようになっているとします
/u/howard/src/blurfl/blurfl.c
。この設定は、
-p0
変更されていないフルパス名を提供します。
-p1
与えられたu/howard/src/blurfl/blurfl.c
前にスラッシュはありません。
-p4
与えられたblurfl/blurfl.c
続けて次のように言います。
-p
これをまったく指定しないと、blurfl.c
先行パス()のすべてのディレクトリがu/howard/src/blurfl
存在し、パスが相対パスではない場合にのみ提供されます。この場合、フルパス名が変更されていない状態で表示されます。その結果、現在のディレクトリまたはオプションで指定されたディレクトリから何でも検索されます-d
。
つまり、適用されるファイルへの絶対パスを含むパッチを取得し、そのファイルを別のディレクトリに保持する場合は、-p
適切な番号を使用してパッチのパスを-d
(または現在のディレクトリ)に「オフセット」できます。 。
答え2
これ修理するこのコマンドは、ファイルの変更方法に関するソースファイルの指示を読み、次に変更を適用します(例:詳しくは)。そして通り過ぎる-pNフラグをスキップしました。窒素パッチファイルのファイル名の前にはスラッシュがあります。
ディレクトリ部分に関する内容です。違いヘッダー。あなたの場合、diffヘッダーには次の文字列が含まれています/var/www/html/example.com
。 -p1フラグを使用すると、パッチユーティリティは文字列リーダーからディレクトリを削除し、パッチするvar/www/html/example.com
ディレクトリを取得します。 -p0パラメーターを使用してパッチを適用すると、文字列から何も削除されず、正しく機能しません。
たとえば、
SSH2.xsファイルパッチを正しく呼び出すには(パッチファイルは次の場所にあります)。rt.cpan.org/Public/Bug/Display.html?id=36614):
patch -p1 < net-ssh2-0.18-perl5.10.patch
パッチファイルには、パッチの前に削除したディレクトリが含まれておりNet-SSH-0.18.orig
、SSH2.x2ファイルがあるディレクトリで上記のタスクを実行する必要があります。