引数-p0と-p1の違いは何ですか?


回答:


23

パッチを作成する最も一般的な方法は、diffコマンドまたは何らかのバージョン管理の組み込みのdiff-likeコマンドを実行することです。場合によっては、2つのファイルを比較するだけで、次のdiffように実行します。

diff -u version_by_alice.txt version_by_bob.txt >alice_to_bob.patch

次に、1つのファイルの変更を含み、ファイル名をまったく含まないパッチを取得します。そのパッチを適用する場合、どのファイルに適用するかを指定する必要があります。

patch <alice_to_bob.patch version2_by_alice.txt

多くの場合、ディレクトリに含まれるマルチファイルプロジェクト全体の2つのバージョンを比較しています。典型的な呼び出しはdiff次のようになります。

diff -ru old_version new_version >some.patch

次に、パッチには、などのヘッダー行で指定されたファイル名が含まれますdiff -ru old_version/dir/file new_version/dir/file。ファイル名からpatch接頭辞(old_versionまたはnew_version)を取り除くように指示する必要があります。つまり、-p11レベルのディレクトリを削除します。

場合によっては、パッチのヘッダー行にファイル名が直接含まれており、先頭に表示されません。これはバージョン管理システムで一般的です。たとえばcvs diff、次のようなヘッダー行を生成しますdiff -r1.42 foo。次に、除去するプレフィックスがないため、を指定する必要があります-p0

比較しているツリーにサブディレクトリがない特別な場合、-pオプションは不要patchです。ファイル名のディレクトリ部分をすべて破棄します。しかし、ほとんどの場合、パッチの作成方法に応じて、-p0またはのいずれかが必要-p1です。


これは長い間私を混乱させてきました。サブディレクトリなしの動作が-p0と異なるのはなぜですか?私は常に-p0がデフォルトであると想定していたので、p0になるはずだった場合は常に問題が発生しました
Brydon Gibson

@BrydonGibsonもともと考えは、パッチの作者がさりげなく書くdiff old/foo new/foo >my.patchか、diff ../old/foo foo >my.patchまたはdiff foo.old foo >my.patchユーザーがpatch <my.patchパッチの作成方法を気にせずにそれを適用し、それから-p便利に追加できるというものだったと思います。しかし、私は実際には知らないpatch、古いユーティリティであり、私がそれを使い始めたときまでに、-p0または-p1すでにそれを使用する最も一般的な方法でした。
ジル「SO-悪であるのをやめる」

16

男から:

-pnum または --strip=num パッチファイルで見つかった各ファイル名から、先頭にnum個のスラッシュを含む最小のプレフィックスを削除します。1つ以上の隣接するスラッシュのシーケンスは、単一のスラッシュとしてカウントされます。これは、パッチを送信した人とは異なるディレクトリにファイルを保存する場合に、パッチファイルで見つかったファイル名の処理方法を制御します。 たとえば、パッチファイルのファイル名が次のようになっていると仮定します。

 /u/howard/src/blurfl/blurfl.c

設定-p0により、ファイル名全体が変更されず-p1与えられ、

 u/howard/src/blurfl/blurfl.c

先行スラッシュなしで-p4与える

 blurfl/blurfl.c

4

違いは、後-pの数字が削除されるパスコンポーネントの数を指定することです。

道があるとしましょう/Barack/Obama-p0引数を指定してパッチを実行すると、パスはそのまま扱われます

/Barack/Obama

しかし、パッチを当てながらパスをトリミングできます。

-p1ルートスラッシュを削除します(スラッシュが残されていない状態で、現在はBarackになっていることに注意してください)。

Barack/Obama

-p2 Barack(および隣接する右スラッシュ)を削除します。

 Obama

このpatch動作の「理由」を拡張するには、このスレッドを読んでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.