回答:
パッチを作成する最も一般的な方法は、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
)を取り除くように指示する必要があります。つまり、-p1
1レベルのディレクトリを削除します。
場合によっては、パッチのヘッダー行にファイル名が直接含まれており、先頭に表示されません。これはバージョン管理システムで一般的です。たとえばcvs diff
、次のようなヘッダー行を生成しますdiff -r1.42 foo
。次に、除去するプレフィックスがないため、を指定する必要があります-p0
。
比較しているツリーにサブディレクトリがない特別な場合、-p
オプションは不要patch
です。ファイル名のディレクトリ部分をすべて破棄します。しかし、ほとんどの場合、パッチの作成方法に応じて、-p0
またはのいずれかが必要-p1
です。
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
すでにそれを使用する最も一般的な方法でした。
男から:
-pnum
または--strip=num
パッチファイルで見つかった各ファイル名から、先頭にnum個のスラッシュを含む最小のプレフィックスを削除します。1つ以上の隣接するスラッシュのシーケンスは、単一のスラッシュとしてカウントされます。これは、パッチを送信した人とは異なるディレクトリにファイルを保存する場合に、パッチファイルで見つかったファイル名の処理方法を制御します。 たとえば、パッチファイルのファイル名が次のようになっていると仮定します。/u/howard/src/blurfl/blurfl.c
設定
-p0
により、ファイル名全体が変更されずに-p1
与えられ、u/howard/src/blurfl/blurfl.c
先行スラッシュなしで、
-p4
与えるblurfl/blurfl.c
違いは、後-p
の数字が削除されるパスコンポーネントの数を指定することです。
道があるとしましょう/Barack/Obama
。-p0
引数を指定してパッチを実行すると、パスはそのまま扱われます。
/Barack/Obama
しかし、パッチを当てながらパスをトリミングできます。
-p1
ルートスラッシュを削除します(スラッシュが残されていない状態で、現在はBarackになっていることに注意してください)。
Barack/Obama
-p2
Barack(および隣接する右スラッシュ)を削除します。
Obama
このpatch
動作の「理由」を拡張するには、このスレッドを読んでください。