コマンドラインのマニュアル

Man » patch マニュアルオンライン - patch マニュアルページに関する詳細なオンラインドキュメント

🌍
patch - 差分ファイルを元ファイルに適用する

概要

patch [オプション] [元ファイル [差分ファイル]]

通常は、次のように使用します。

patch -p数値 <差分ファイル

説明

patch は、diff プログラムによって生成された差分リストを含む差分ファイル patchfile を受け取り、それを 1 つ以上の元ファイルに適用して、修正されたバージョンを生成します。通常、修正されたバージョンは元のファイルに置き換えられます。バックアップを作成できます。-b または --backup オプションを参照してください。パッチを適用するファイルの名前は通常、差分ファイルから取得されますが、パッチを適用するファイルが 1 つしかない場合は、コマンドラインで元ファイルとして指定できます。

起動時に、patch は、-c (--context)、-e (--ed)、-n (--normal)、または -u (--unified) オプションでオーバーライドされない限り、差分リストのタイプを決定しようとします。コンテキスト差分 (旧形式、新形式、および統一形式) と通常差分は、patch プログラムによって直接適用されます。ed 差分は、単に ed(1) エディターにパイプで渡されます。

patch は、先頭にある不要なものをスキップし、差分を適用し、次に末尾にある不要なものをスキップしようとします。したがって、差分リストを含む電子メールメッセージを patch に渡しても、正常に機能します。差分全体が一貫してインデントされている場合、行が CRLF で終わる場合、または差分がインターネット RFC 934 で指定されているように、先頭に "- " を付けて 1 回以上カプセル化されている場合、これらは考慮されます。インデントまたはカプセル化を削除した後、先頭が "#" で始まる行はコメントとして無視されます。

コンテキスト差分の場合、そしてある程度は通常差分の場合、patch は、パッチに示されている行番号が間違っている場合を検出し、パッチの各部分を適用する正しい場所を見つけようとします。最初の推測として、patch は、パッチの行番号に、前のパッチを適用する際に使用されたオフセットを加算または減算します。それでも正しい場所でない場合、patch は、コンテキストで指定されている行と一致する一連の行を、前方および後方にスキャンします。まず、patch は、すべてのコンテキスト行が一致する場所を探します。そのような場所が見つからない場合、コンテキスト差分であり、最大のファズファクターが 1 以上に設定されている場合は、別のスキャンが実行され、その際、コンテキストの最初の行と最後の行が無視されます。それでも失敗し、最大のファズファクターが 2 以上に設定されている場合は、最初の 2 行と最後の 2 行のコンテキストが無視され、別のスキャンが実行されます (デフォルトの最大のファズファクターは 2 です)。

先頭のコンテキストよりも末尾のコンテキストが少ないパッチ (ファズを適用した後) は、最初の行番号が 1 の場合に、ファイルの先頭に適用する必要があります。先頭のコンテキストよりも末尾のコンテキストが多いパッチは、ファイルの末尾に適用する必要があります。

パッチが、パッチの一部をインストールする場所を見つけられない場合、その部分を拒否ファイルに出力します。通常、拒否ファイルの名前は、出力ファイル名に .rej サフィックスを付けたものになります。ただし、.rej を追加するとファイル名が長くなりすぎる場合は、代わりに # を使用します。それでもファイル名が長すぎる場合は、ファイル名の最後の文字を # で置き換えます。

拒否された部分は、統一形式またはコンテキスト形式の差分として出力されます。入力が通常の差分の場合、多くのコンテキストは単に空になります。拒否ファイル内の各部分の行番号は、パッチファイル内の行番号とは異なる場合があります。拒否ファイル内の行番号は、パッチがその部分を新しいファイルに配置しようとしたおおよその場所を反映しており、古いファイルの場所を反映しているわけではありません。

各部分が処理されるたびに、その部分が正常にインストールされたか、そうでないかが通知されます。そうでない場合、パッチがその部分を配置しようとした行番号(新しいファイル内)も通知されます。パッチが、差分に指定された行番号とは異なる行にインストールされた場合、そのオフセットも通知されます。大きなオフセットは、その部分が間違った場所にインストールされたことを示す可能性があります。ファジーマッチングが使用された場合も通知されます。その場合は、少し注意が必要です。--verbose オプションが指定されている場合、完全に一致した部分についても通知されます。

コマンドラインで元のファイル (origfile) が指定されていない場合、パッチは、先頭にある不要な情報から編集するファイルの名前を推測しようとします。

まず、パッチは、次の順序で候補となるファイル名のリストを作成します。

コンテキスト形式のヘッダーの場合、パッチはヘッダー内の古いファイル名と新しいファイル名を使用します。ファイル名に -pnum または --strip=num オプションで指定されたスラッシュの数が足りない場合、そのファイル名は無視されます。/dev/null も無視されます。

^ ndex: 行が先頭の不要な情報に含まれており、古いファイル名と新しいファイル名の両方が存在しない場合、またはパッチが POSIX 準拠の場合、パッチは Index: 行のファイル名を使用します。

次の規則の目的では、候補となるファイル名は、ヘッダーに表示される順序に関係なく、(古いファイル名、新しいファイル名、インデックス) の順序で考慮されます。

次に、パッチは、候補リストからファイル名を選択します。

名前付きファイルの一部が存在する場合、パッチは POSIX 準拠の場合は最初のファイル名を選択し、それ以外の場合は最適なファイル名を選択します。

パッチが RCS、ClearCase、Perforce、および SCCS を無視しない(-g num または --get=num オプションを参照)場合、名前付きファイルが存在せず、RCS、ClearCase、Perforce、または SCCS のマスターファイルが見つかった場合、パッチは RCS、ClearCase、Perforce、または SCCS のマスターファイルを持つ最初の名前付きファイルを選択します。

名前付きファイルが存在せず、RCS、ClearCase、Perforce、または SCCS のマスターファイルが見つからず、いくつかの名前が与えられ、パッチが POSIX 準拠ではなく、パッチがファイルを作成するように見える場合、パッチは、最も少ない数のディレクトリを作成する必要がある最適なファイル名を選択します。


ファイル名が上記のヒューリスティックによって得られない場合、パッチを適用するファイルの名前が求められ、パッチはその名前を選択します。

空でないファイル名のリストの中で最適なものを決定するために、パッチはまず、パス名のコンポーネント数が最も少ない名前をすべて選択します。その中から、ベース名が最も短い名前をすべて選択します。さらに、名前が最も短いものをすべて選択し、最後に残っている最初の名前を選択します。

さらに、ヘッダーの不要な情報に「Prereq:」という行が含まれている場合、パッチは前提条件の行から最初の単語(通常はバージョン番号)を取得し、元のファイルにその単語が含まれているかどうかを確認します。含まれていない場合、パッチは続行する前に確認を求めます。

これらすべての結果として、次のようなシェルコマンドを実行できるはずです。

    patch -d /usr/src/local/blurfl

これにより、標準入力から読み取ったパッチを使用して、blurflディレクトリ内のファイルを直接パッチできます。

パッチファイルに複数のパッチが含まれている場合、パッチはそれぞれを個別のパッチファイルから取得したかのように適用しようとします。これは、他の多くのことの中でも、パッチを適用するファイルの名前は各差分リストに対して決定される必要があり、各差分リストの前の不要な情報にはファイル名やバージョンレベルなど、前に述べたような有用な情報が含まれていると想定されることを意味します。

オプション

-b または --backup

バックアップファイルを作成します。つまり、ファイルをパッチするときに、元のファイルを削除する代わりに、名前を変更またはコピーします。-Vまたは--version-controlオプションを参照して、バックアップファイルのファイル名がどのように決定されるかを確認してください。

--backup-if-mismatch

パッチがファイルと完全に一致しない場合に、バックアップがそれ以外に要求されていない場合は、ファイルをバックアップします。これは、パッチがPOSIXに準拠していない場合のデフォルトです。

--no-backup-if-mismatch

パッチがファイルと完全に一致しない場合に、バックアップがそれ以外に要求されていない場合は、ファイルをバックアップしません。これは、パッチがPOSIXに準拠している場合のデフォルトです。

-B pref または --prefix=pref

単純な方法を使用してバックアップファイルのファイル名を決定します(-Vメソッドまたは--version-controlメソッドオプションを参照)。バックアップファイルのファイル名を生成するときに、ファイル名にprefを付加します。たとえば、-B /junk/の場合、src/patch/util.cの単純なバックアップファイル名は/junk/src/patch/util.cになります。

--binary

標準出力と/dev/ttyを除くすべてのファイルをバイナリモードで書き込みます。読み込み時は、CRLF行末をLF行末に変換するヒューリスティックを無効にします。このオプションは、POSIXシステム上で、POSIX以外のシステムで生成されたパッチをPOSIX以外のファイルに適用する場合に必要です。(POSIXシステムでは、ファイルの読み書きは行末を変換しません。Windowsでは、読み書きはデフォルトで行末を変換し、行末が重要な場合は、diff --binaryを使用してパッチを生成する必要があります。)

-c または --context

パッチファイルを通常のコンテキスト差分として解釈します。

-d dir または --directory=dir

他の操作を行う前に、直ちにディレクトリdirに移動します。


-D define または --ifdef=define

#ifdef ... #endif 構造を使用して変更箇所をマークします。define が区別記号として使用されます。

--dry-run

パッチを適用した結果を表示しますが、実際にファイルを変更することはありません。

-e または --ed

パッチファイルを ed スクリプトとして解釈します。

-E または --remove-empty-files

パッチ適用後に空になった出力ファイルを削除します。通常、このオプションは 不要です。patch はヘッダーのタイムスタンプを調べて、パッチ適用後に ファイルが存在すべきかどうかを判断できるためです。ただし、入力がコンテキスト diff でない場合や、patch が POSIX に準拠している場合、このオプションが指定されない限り、patch は空のパッチ済みファイルを削除しません。 patch がファイルを削除する際、空の上位ディレクトリも合わせて削除しようとします。

-f または --force

ユーザーが自分の操作を正確に把握しているものと見なし、一切の質問を行いません。 ヘッダーにパッチ対象ファイルが明示されていないパッチをスキップします。パッチ内の Prereq: 行と バージョンが一致しないファイルにもパッチを適用し、逆向きに見えるパッチであっても 逆向きではないと見なします。このオプションは解説出力を抑制しません。それには -s を使用してください。

-F num または --fuzz=num

最大ファズ係数を設定します。このオプションはコンテキスト diff にのみ適用され、 ハンクをインストールする場所を探す際に、指定された行数までのコンテキスト行を無視するよう patch に指示します。ファズ係数が大きいほど、誤ったパッチが適用される可能性が高まることに注意してください。デフォルトのファズ係数は 2 です。コンテキスト diff のコンテキスト行数(通常は 3)以上のファズ係数は、 すべてのコンテキストを無視します。

-g num または --get=num

このオプションは、ファイルが RCS または SCCS で管理されており、存在しないか 読み取り専用でデフォルトバージョンと一致する場合、またはファイルが ClearCase または Perforce で管理されており存在しない場合の、patch の動作を制御します。num が正の値の場合、patch は リビジョン管理システムからファイルを取得(またはチェックアウト)します。ゼロの場合、patch は RCS、ClearCase、Perforce、SCCS を無視し、 ファイルを取得しません。負の値の場合、patch はファイルを取得するかどうかをユーザーに尋ねます。 このオプションのデフォルト値は、環境変数 PATCH_GET が設定されていればその値によって与えられます。 設定されていない場合、デフォルト値はゼロです。

--help

オプションの概要を表示して終了します。

-i patchfile または --input=patchfile

patchfile からパッチを読み込みます。patchfile が - の場合、標準入力から読み込みます(デフォルト)。

-l または --ignore-whitespace

ファイル内のタブやスペースが乱れている場合に備えて、パターンを緩やかにマッチさせます。パッチファイル内の 1つ以上の空白の連続は、元のファイル内の任意の空白の連続とマッチし、行末の空白の連続は無視されます。 通常の文字は厳密に一致しなければなりません。コンテキストの各行は、元のファイルの行と一致しなければなりません。

--merge または --merge=merge または --merge=diff3

diff3(1) や merge(1) と同様の方法で、パッチファイルを元のファイルにマージします。競合が検出された場合、 patch は警告を出力し、競合部分を <<<<<<< と >>>>>>> の行で囲みます。典型的な 競合は次のように表示されます。


<<<<<<<
元のファイルからの行
|||||||
パッチからの元の行
=======
パッチからの新しい行
>>>>>>>

`--merge`オプションは、競合の出力形式を決定します。`diff3`形式では、`|||||||`セクションにパッチからの元の行が表示されます。`merge`形式では、このセクションは表示されません。`merge`形式がデフォルトです。

このオプションは、`--forward`を暗黙的に指定し、`--fuzz=num`オプションは考慮しません。

-n または --normal
パッチファイルを通常のdiffとして解釈します。

-N または --forward
パッチが適用できない場合、`patch`は通常、最初のチャンクを逆適用して、パッチがすでに適用されているかどうかを確認します。`--forward`オプションはこの動作を抑制します。`-R`も参照してください。

-o outfile または --output=outfile
パッチをインプレースで適用する代わりに、出力を`outfile`に送信します。`outfile`がパッチを適用するファイルの1つである場合は、このオプションを使用しないでください。`outfile`が`-`の場合、出力を標準出力に送信し、通常は標準出力に出力されるメッセージを標準エラーに出力します。

-pnum または --strip=num
パッチファイルで見つかった各ファイル名の先頭にある`num`個の先頭スラッシュを削除します。1つまたは複数の隣接するスラッシュのシーケンスは、1つのスラッシュとしてカウントされます。これにより、パッチファイル内のファイル名がどのように処理されるかが制御されます。これは、ファイルをパッチを送信した人とは異なるディレクトリに保存している場合に役立ちます。たとえば、パッチファイル内のファイル名が次のようになっているとします。

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

`-p0`を設定すると、ファイル名全体が変更されずに使用されます。`-p1`を設定すると、次のようになります。

u/howard/src/blurfl/blurfl.c

先頭のスラッシュが削除されます。`-p4`を設定すると、次のようになります。

blurfl/blurfl.c

`-p`を指定しない場合、`blurfl.c`だけが表示されます。最終的に得られたファイル名は、現在のディレクトリまたは`-d`オプションで指定されたディレクトリで検索されます。

--posix
POSIX標準にさらに厳密に準拠します。

diffヘッダーからファイル名を推測するときに、リスト内の最初に見つかったファイル(古いファイル、新しいファイル、インデックス)を使用します。

パッチ適用後に空になったファイルは削除しません。

RCS、ClearCase、Perforce、またはSCCSからファイルを読み込むかどうか尋ねません。

すべてのオプションは、コマンドラインのファイルの前に置く必要があります。

不一致がある場合、ファイルのバックアップは行いません。

--quoting-style=word
出力名の引用に使用するスタイルを`word`で指定します。`word`は、次のいずれかの値である必要があります。

literal
ファイル名をそのまま出力します。

shell
ファイル名にシェルメタ文字が含まれている場合、または曖昧な出力が発生する可能性がある場合は、シェル用にファイル名を引用します。

shell-always
通常は引用する必要がない場合でも、シェル用にファイル名を引用します。

c
C言語文字列としてファイル名を引用します。

escape
`c`と同様に引用しますが、周囲の二重引用符は省略します。

`--quoting-style`オプションのデフォルト値を環境変数`QUOTING_STYLE`で指定できます。この環境変数が設定されていない場合、デフォルト値は`shell`になります。

-r rejectfile または --reject-file=rejectfile
拒否された部分を、デフォルトの `.rej` ファイルではなく、`rejectfile` に出力します。`rejectfile` が `-` の場合、拒否された部分は破棄されます。

-R または --reverse
このパッチが、古いファイルと新しいファイルが入れ替わった状態で作成されたと仮定します。(そうした状況が時々発生します。)`patch` は、各チャンクを適用する前に、入れ替わるように試みます。拒否された部分は、入れ替わった形式で出力されます。`-R` オプションは、`ed` 形式の差分スクリプトでは機能しません。なぜなら、逆の操作を再構築するのに十分な情報がないからです。

最初のチャンクのパッチが失敗した場合、`patch` はそのチャンクを逆にして、適用できるかどうかを確認します。適用できる場合、`-R` オプションを設定するかどうか尋ねられます。適用できない場合、パッチは通常どおり適用され続けます。(注:この方法は、通常の差分であり、最初のコマンドが追加(つまり、削除であるべき)である場合、パッチが逆になっているかどうかを検出できません。なぜなら、追加は常に成功するからです。これは、空のコンテキストがどこでも一致するためです。幸いなことに、ほとんどのパッチは行を追加または変更するため、ほとんどの逆の通常の差分の最初のコマンドは削除であり、その削除が失敗するため、ヒューリスティックがトリガーされます。)

--read-only=behavior
読み取り専用ファイルを変更しようとする場合に、リクエストされたように動作します。潜在的な問題を無視するか、警告するか(デフォルト)、または失敗します。

--reject-format=format
拒否されたファイルを指定された形式(コンテキストまたは統一形式)で出力します。このオプションを指定しない場合、入力パッチが統一形式の場合、拒否されたチャンクは統一差分形式で出力され、それ以外の場合は通常のコンテキスト差分形式で出力されます。

-s または --silent または --quiet
エラーが発生しない限り、静かに動作します。

--follow-symlinks
入力ファイルを検索するときに、シンボリックリンクをたどります。シンボリックリンクを置き換えるのではなく、シンボリックリンクが指すファイルを変更します。Gitスタイルのシンボリックリンクへのパッチは、適用できなくなります。このオプションは、`patch` の以前のバージョンとの互換性のために存在します。その使用は推奨されません。

-t または --batch
`-f` のように質問を抑制しますが、いくつかの異なる仮定を行います。ファイル名を含まないヘッダーを持つパッチをスキップします(`-f` と同じ)。`Prereq:` 行のパッチで、ファイルが間違ったバージョンである場合にパッチをスキップします。パッチが逆になっているように見える場合は、逆であると仮定します。

-T または --set-time
コンテキスト差分ヘッダーで指定されたタイムスタンプから、パッチされたファイルの変更時刻とアクセス時刻を設定します。タイムスタンプに指定されていない場合は、コンテキスト差分ヘッダーがローカル時間を基準にしていると仮定します。

このオプションを、タイムゾーンを含まないタイムスタンプで使用することは推奨されません。なぜなら、ローカル時間を使用するパッチは、他のタイムゾーンの人々が簡単に使用できず、また、ローカルタイムスタンプは、ローカルの時計が夏時間の調整中に逆方向に進むときに曖昧になる可能性があるからです。タイムゾーンを含めるか、UTC を使用してパッチを生成し、`-Z` または `--set-utc` オプションを使用してください。

-u または --unified
パッチファイルを統一されたコンテキスト差分として解釈します。

-v または --version
パッチのバージョンヘッダーとパッチレベルを出力して終了します。

-V メソッド または --version-control=メソッド
バックアップファイル名を決定するためにメソッドを使用します。このメソッドは、環境変数 PATCH_VERSION_CONTROL(または、設定されていない場合は VERSION_CONTROL)によってオーバーライドされる場合があります。このオプションは、バックアップファイルが作成されるかどうかには影響せず、作成される可能性のあるバックアップファイルの名前のみに影響します。

メソッドの値は、GNU Emacs のバージョン管理変数と同様です。patch は、より記述的な同義語も認識します。有効なメソッド値は次のとおりです(一意の省略形も使用できます)。

existing または nil
すでにバックアップファイルがあるファイルに対しては番号付きのバックアップを作成し、それ以外の場合は単純なバックアップを作成します。これはデフォルトです。

numbered または t
番号付きのバックアップを作成します。番号付きのバックアップファイル名は、F.~N~ で、N はバージョン番号です。

simple または never
単純なバックアップを作成します。-B または --prefix、-Y または --basename-prefix、および -z または --suffix オプションは、単純なバックアップファイル名を指定します。これらのオプションが指定されていない場合、単純なバックアップサフィックスが使用されます。これは、SIMPLE_BACKUP_SUFFIX 環境変数が設定されている場合はその値、そうでない場合は .orig です。

番号付きまたは単純なバックアップの場合、バックアップファイル名が長すぎる場合、バックアップサフィックス ~ が使用されます。さらに、~ を追加すると名前が長すぎる場合、~ がファイル名の最後の文字に置き換えられます。

--verbose
実行中の作業に関する追加情報を出力します。

-x num または --debug=num
patch プログラマにとってのみ興味深い、内部デバッグフラグを設定します。

-Y プレフィックス または --basename-prefix=プレフィックス
単純なメソッドを使用してバックアップファイル名を決定し(-V メソッドまたは --version-control メソッド オプションを参照)、バックアップファイル名を生成するときに、ファイル名のベース名にプレフィックスを付加します。たとえば、-Y .del/ を使用すると、src/patch/util.c の単純なバックアップファイル名は src/patch/.del/util.c になります。

-z サフィックス または --suffix=サフィックス
単純なメソッドを使用してバックアップファイル名を決定し(-V メソッドまたは --version-control メソッド オプションを参照)、サフィックスを使用します。たとえば、-z - を使用すると、src/patch/util.c のバックアップファイル名は src/patch/util.c- になります。

-Z または --set-utc
コンテキスト差分ヘッダーで指定されたタイムスタンプから、パッチされたファイルの修正時刻とアクセス時刻を設定します。タイムスタンプが指定されていない場合は、コンテキスト差分ヘッダーが協定世界時(UTC、またはグリニッジ標準時)を使用すると想定します。-T または --set-time オプションも参照してください。

-Z または --set-utc と -T または --set-time オプションは、通常、ファイルの元の時刻がパッチヘッダーの時刻と一致しない場合、またはコンテンツがパッチと完全に一致しない場合は、ファイルの時刻を設定しません。ただし、-f または --force オプションが指定されている場合、ファイルの時刻は常に設定されます。

diff出力形式の制限により、これらのオプションでは、内容が変更されていないファイルのタイムスタンプを更新できません。 また、これらのオプションを使用する場合は、後続のmakeの実行で混乱が生じないように、パッチされたファイルに依存するすべてのファイルを削除(例:make clean)する必要があります。

環境変数

PATCH_GET

パッチがRCS、ClearCase、Perforce、またはSCCSから、デフォルトで不足しているファイルまたは読み取り専用のファイルを取得するかどうかを指定します。-gまたは--getオプションを参照してください。

POSIXLY_CORRECT

設定されている場合、パッチはより厳密にPOSIX標準に準拠します。--posixオプションを参照してください。

QUOTING_STYLE

--quoting-styleオプションのデフォルト値を指定します。

SIMPLE_BACKUP_SUFFIX

単純なバックアップファイル名の拡張子として.origの代わりに使うものを指定します。

TMPDIR、TMP、TEMP

一時ファイルを配置するディレクトリを指定します。パッチは、これらのリストにある設定されている最初の環境変数を使用します。いずれも設定されていない場合、デフォルトはシステムに依存します。通常、Unixホストでは/tmpです。

VERSION_CONTROLまたはPATCH_VERSION_CONTROL

バージョン管理スタイルを選択します。-vまたは--version-controlオプションを参照してください。

ファイル

$TMPDIR/p*

一時ファイル

/dev/tty

制御端末。ユーザーに質問をして回答を得るために使用されます。

関連項目

diff(1)、ed(1)、merge(1)。

マーシャル・T・ローズとエイナー・A・ステッフェルド、メッセージカプセル化に関する提案標準、インターネットRFC 934 [https://datatracker.ietf.org/doc/html/rfc934] (1985-01)。

パッチ送信者への注意

パッチを送信する場合は、いくつかの点に注意する必要があります。

パッチを体系的に作成してください。バージョン管理システムを使用する場合は簡単です。たとえば、Gitを使用すると、git diffを使用できます。それ以外の場合、良い方法は、diff -Naur old newコマンドを使用することです。ここで、oldとnewは、古いディレクトリと新しいディレクトリを識別します。oldとnewという名前には、スラッシュを含めないでください。

パッチがファイルの内容だけでなく、ファイルタイムスタンプも通信する必要がある場合、diffコマンドのヘッダーには、伝統的なUnix形式で、UTCの時間と日付を含める必要があります。これにより、パッチの受信者は-Zまたは--set-utcオプションを使用できます。このようなヘッダーを生成するコマンドの例を以下に示します(Bourneシェル構文を使用)。

LC_ALL=C TZ=UTC0 diff -Naur myprog-2.7 myprog-2.8

パッチを適用するには、受信者がどのディレクトリにcdし、どのパッチオプションを使用するかを伝えてください。オプション文字列-Np1を推奨します。受信者を装って、元のファイルのコピーにパッチを適用して、手順をテストしてください。

patchlevel.hファイルを作成して、パッチレベルをインクリメントする最初のdiffをパッチファイルに含めることで、多くの問題を回避できます。パッチにPrereq:行を含めると、パッチが順番に適用されない場合に警告が表示されます。


空のファイルまたはエポック(1970-01-01 00:00:00 UTC)のファイルと比較した差分を送信することで、ファイルを作成できます。これは、ターゲットディレクトリに作成するファイルがすでに存在しない場合にのみ機能します。逆に、削除するファイルと空のファイル(エポックの日付)を比較するコンテキスト差分を送信することで、ファイルを削除できます。ファイルは削除されます。ただし、patchがPOSIXに準拠しており、-Eまたは--remove-empty-filesオプションが指定されていない場合を除きます。ファイルを作成および削除するパッチを簡単に生成するには、GNU diff-Nまたは--new-fileオプションを使用します。

受信者が-pNオプションを使用するようにする場合、次のような出力を送信しないでください。

diff -Naur v2.0.29/prog/README prog/README
--- v2.0.29/prog/README   Mon Mar 10 15:13:12 2024
+++ prog/README   Mon Mar 17 14:58:22 2024

これは、2つのファイル名にスラッシュの数が異なり、異なるバージョンのpatchがファイル名を異なる方法で解釈するためです。混乱を避けるために、次のような形式の出力を送信してください。

diff -Naur v2.0.29/prog/README v2.0.30/prog/README
--- v2.0.29/prog/README   Mon Mar 10 15:13:12 2024
+++ v2.0.30/prog/README   Mon Mar 17 14:58:22 2024

^ EADME.origのようなバックアップファイル名を比較するパッチを送信することは避けてください。これは、patchがバックアップファイルをパッチ処理するのではなく、実際のファイルをパッチ処理するように誘導してしまう可能性があるためです。代わりに、同じ基本ファイル名を異なるディレクトリ(例:old/READMEnew/README)で比較するパッチを送信します。

反転されたパッチを送信しないように注意してください。これは、人々がすでにパッチを適用したかどうか疑問に思うようになるためです。

派生ファイル(たとえば、makefileconfigure: configure.acという行があるconfigureファイル)を変更するパッチを送信することは避けてください。受信者は、派生ファイルを再生成できるはずだからです。派生ファイルの差分を送信する必要がある場合は、UTCを使用して差分を生成し、受信者に-Zまたは--set-utcオプションでパッチを適用させ、パッチ処理されたファイルに依存するパッチ処理されていないファイルを削除させます(例:make cleanを使用)。

582個の差分リストを1つのファイルにまとめることはできるかもしれませんが、関連するパッチを別々のファイルにグループ化する方が賢明かもしれません。何かがうまくいかない場合に備えてです。

診断

診断は通常、patchがパッチファイルを解析できなかったことを示します。

^ verboseオプションが指定されている場合、Hmm...というメッセージは、パッチファイルに処理されていないテキストが含まれており、patchがそのテキストにパッチが含まれているかどうか、また、どのような種類のパッチであるかを推測しようとしていることを示します。

^ atchの終了ステータスは、すべてのハнкが正常に適用された場合は0、いくつかのハнкを適用できないか、マージ競合が発生した場合は1、より深刻な問題が発生した場合は2です。一連のパッチをループで適用する場合は、この終了ステータスをチェックして、後続のパッチを部分的にパッチ処理されたファイルに適用しないようにする必要があります。

注意事項

コンテキスト差分を使用して、空のファイル、空のディレクトリ、またはシンボリックリンクなどの特殊ファイルの作成または削除を確実に表現することはできません。また、所有権、権限、または1つのファイルが別のファイルへのハードリンクであるかどうかなど、ファイルメタデータへの変更も表現できません。このような変更も必要な場合は、それらを達成するための別の手順(たとえば、シェルスクリプト)をパッチに含める必要があります。


patch は、ed スクリプト内の行番号がずれているかどうかを判断できず、通常の diff で変更または削除が見つかった場合にのみ、無効な行番号を検出できます。ファズファクター 3 を使用したコンテキスト diff にも、同じ問題が発生する可能性があります。このような場合は、コンテキスト diff を実行して、変更が妥当かどうかを確認する必要があります。もちろん、エラーなしでコンパイルできることは、パッチが適用されたことを示すのに役立ちますが、必ずしもそうとは限りません。

patch は通常、推測を重ねる必要があっても、正しい結果を生成します。ただし、結果が確実に正しいのは、パッチを、パッチが生成されたファイルの正確なバージョンに適用した場合のみです。

互換性の問題

POSIX 標準は、GNU patch と異なる動作を指定しています。

POSIX patch では、-b オプションが使用されていない場合、不一致がある場合でもバックアップは作成されません。GNU patch では、この動作は、--no-backup-if-mismatch オプション、または --posix オプションを使用して POSIX に準拠するか、POSIXLY_CORRECT 環境変数を設定することで有効になります。

patch は、コンテキスト diff ヘッダーと Index 行のファイル名がすべて、プレフィックスを削除した後に同一である場合に、POSIX 準拠のオプションの複雑な方法を使用して、パッチヘッダーからパッチを適用するファイルの推測を行います。パッチの各ヘッダーのファイル名にすべて同じ数のスラッシュが含まれている場合、パッチは通常、互換性があります。

GNU patch または POSIX に準拠するパッチで実行できる命令を送信する場合は、次のオプションに制限してください。スペースはオプションです。

-b
-c
-d dir
-D define
-e
-i patchfile
-l
-n
-N
-o outfile
-p num
-R
-r rejectfile
-u

バグ

バグは、メールで <_> に報告してください。

コードが重複している場合 (たとえば、#ifdef OLDCODE ... #else ... #endif)、patch は両方のバージョンをパッチ処理できません。パッチが適用された場合でも、おそらく誤ったバージョンをパッチ処理し、成功したと表示します。

すでに適用したパッチを適用すると、patch はそれを逆パッチとみなし、パッチを元に戻すことを提案します。これは、ある意味では機能と見なすことができます。

ハンクをマージする方法を計算することは、標準のファジーアルゴリズムを使用するよりもはるかに困難です。大きなハンク、より多くのコンテキスト、元の場所からの大きなオフセット、およびより悪い一致はすべて、アルゴリズムを遅くします。

ライセンス

Copyright © 1989–2025 Free Software Foundation, Inc. Copyright © 1984–1986, 1988 Larry Wall.

このマニュアルの逐語的なコピーを作成および配布する許可は、すべてのコピーに著作権表示とこの許可表示が保存されていることを条件とします。


このマニュアルの修正版をコピーおよび配布する許可は、逐語的なコピーの条件の下で与えられます。ただし、結果として得られる派生作品全体が、この許可通知と同一の条項の下で配布されるものとします。 このマニュアルを別の言語に翻訳してコピーおよび配布する許可は、上記の修正版の条件の下で与えられます。ただし、この許可通知は、著作権者によって承認された翻訳に含めることができます。元の英語の許可通知の代わりに含めることができます。

著者

ラリー・ウォールは、元の patch を作成しました。ポール・エッガートは、patch の任意の上限を削除し、バイナリファイル、ファイル時間の設定、ファイルの削除のサポートを追加し、より POSIX に準拠するようにしました。その他の貢献者には、unidiff のサポートを追加したウェイン・デイビソンと、構成とバックアップのサポートを追加したデイビッド・マッケンジーがいます。アンドレアス・グルエンバッハは、マージのサポートを追加しました。