patch(1) FreeBSD 一般コマンドマニュアル

patch

前のページ 上に戻る 次のページ

patch



書式

       patch [options] [origfile [patchfile]] [+ [options] [orig-
       file]]...

       ですが、たいていは以下のようにします。

       patch <patchfile


解説

       patch は、 diff プログラムによって生成された 4 つの形式 の
       差分情報を含むパッチファイルを受け付け、オリジナルファイル
       にその差分を当てて、パッチ済みのバージョンを生成します。

       デフォルト動作では、オリジナルは ".orig" の拡張子  ( 長 い
       ファイル名を扱えないシステムでは "~") を付けてバックアップ
       として残した上で、オリジナルファイルはパッチ済みのバージョ
       ンに置き換えられます。オリジナルをバックアップする拡張子は
       オプション -b (--suffix), -B  (--prefix)   あ る い は  -V
       (--version-control)   に よっ て、 あ る いは環境変数 SIM-
       PLE_BACKUP_SUFFIX によっても変更できます。環境変数による指
       定はオプション指定によって上書きされます。

       バッ クアップファイルが既に存在していた場合、 patch は新し
       いバックアップファイル名として、ファイル名本体の中で最初に
       出てくる英小文字の部分を大文字に替えたものを使います。英小
       文字の部分がなかった場合は、ファイル名の最初の 1 文字削 除
       したものとし、既存のバックアップファイル名と合致しなくなる
       までこれを繰り返します。

       ファイルの出力先は -o (--output) で指定することができま す
       が、 も しそこに既に同じファイル名のファイルが存在していた
       ら、まずバックアップが作られます。

       patchfile が指定されない場合やハイフンである場合、パッチは
       標準入力から読み込まれます。

       patch が最初に行う作業は、差分情報がどんな形式か判別するこ
       とです。これは、オプション -c (--context), -e  (--ed),  -n
       (--normal),  -u (--unified) によって形式を指定することもで
       きます。 context diff (old-style, new-style, unified) およ
       び  normal  diff は patch 自身によりパッチが当てられます。
       ed diff だった場合は、パイプを通して単にパッチファイルをエ
       ディタ ed に入力するだけです。

       patch は、差分情報の前に含まれるゴミをスキップし、差分を適
       用し、そして後に含まれるゴミをスキップしようとします。です
       か ら 差分情報が入った記事やメッセージなどをそのまま patch
       に与えても、うまく動作するはずです。差分全体が一定量だけイ
       ンデントされていても、そのことを考慮のうえ処理されます。

       context diff の場合、そして normal diff の場合もいくらかあ
       てはまりますが、 patch はパッチに書かれた行番号が正しく な
       リ ジェ クトファイルに出力します。リジェクトファイルは、通
       常、出力ファイルに ".rej" の拡張子 (長いファイル名を扱えな
       い シ ステムでは "#") を付けたものになります。 (注意: 入力
       パッチが context diff であっても normal diff であって も、
       リ ジェ クト部分は context diff 形式で出力されます。入力が
       normal diff の場合、コンテキストの多くは単なる null になり
       ます。) このリジェクトファイルに出力される時の差分情報に付
       けられている行番号は、元のパッチファイルにあるものと違った
       ものになっている可能性もありますが、元のものよりは場所的に
       より近い位置になっていると思われる行番号になります。

       パッチの各 hunk が処理される毎に、そのパッチ処理が成 功 し
       た(succeeded)のか失敗した(failed)のかの別と、 patch が推定
       したパッチ適用行位置(新しいファイルにおける行番号) が報 告
       されます。この位置が差分中に示された行番号と異なる場合、そ
       のズレ(オフセット)も報告されます。 hunk のひとつだけが大き
       なオフセットで適用された場合、それは誤った位置に適用された
       ことを意味する「かも」しれません。またパッチ適用に際して曖
       昧 度(fuzz factor)が用いられた場合もその旨報告されます。こ
       の場合は少し疑ってみるべきでしょう。

       もし、オリジナルファイルがコマンドラインで指定されなかった
       場 合、 patch は、エディットすべきファイル名を、差分情報の
       前に付加されているゴミの中から見つけようとします。 context
       diff  のヘッダの場合、ファイル名は "***" もしくは "---" で
       始まる行から探し、既存ファイルに一致する最も短い名前が用い
       ら れます。 context diffには上のような行が含まれますが、も
       しヘッダに "Index:" いう行があったら patch はここから得 た
       ファ イ ル 名 を使うことを試みます。 context diff ヘッダは
       Index 行に優先して用いられます。もしファイル名を見つけるこ
       とができなかった場合、パッチすべきファイル名を入力するよう
       求めます。

       もしオリジナルファイルが見つからないかリードオンリーである
       けれども、 SCCS か RCS ファイルが存在する場合、 patch はそ
       のファイルのゲットもしくはチェックアウトを試みます。

       加えて、もし差分の前のゴミの中に "Prereq: " という行が含ま
       れ ていれば、 patch はその行に必要条件 (通常はバージョン番
       号) が書いてあるものとみなして最初の word を取りだし、オリ
       ジナルファイルの中に同じ word があるかどうかを調べます。も
       しその word が発見できなければ、 patch は処理を実行して よ
       いか、確認を求めるようになります。

       結局のところ、ニュースリーダを使っているときに、パッチを含
       んだ記事に対して

            | patch -d /usr/src/local/blurfl

       のように指示してやれば、blurfl ディレクトリにあるファイ ル
       に記事から直接パッチをあてることができる、ということです。

            ".orig" や "~" の代わりに suff がバックアップファイル
            の拡張子として解釈されるようにします。

       -B pref, --prefix=pref
            pref が、バックアップファイル名の前に付けるプレフィッ
            クスとして解釈されるようにします。この指定を行うと -b
            の指定は無視されます。

       -c, --context
            パッチファイルを context diff 形式として解釈します。

       -C, --check
            どういう処理が行われるか確認します。しかし実行はし ま
            せん。

       -d dir, --directory=dir
            dir  をディレクトリとみなし、処理の前にそのディレクト
            リに移動します。

       -D sym, --ifdef=sym
            "#ifdef...#endif" 構造を用いて差分を示します。差分 情
            報を切り替えるシンボルとして sym が用いられます。

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

       -E, --remove-empty-files
            パッチ適用後、空のファイルは削除するようにします。

       -f, --force
            ユ ー ザ は処理内容を正確に把握しているものとみなし、
            patch は何も尋ねず、次のように仮定して処理を 進 め ま
            す。 すなわち、パッチすべきオリジナルファイル見つける
            ことができなかった場合はスキップします。  ``Prereq:''
            の バ ー ジョンが正しくなくても、パッチを実行します。
            パッチ済みと思われても、リバースパッチではないと仮 定
            します。なお、このオプションは、 patch が表示するメッ
            セージを抑制しません。メッセージを止めるには -s を 使
            います。

       -t, --batch
            -f と同様ですが、次のように仮定します。パッチすべきオ
            リジナルファイルを見つけることができなかった場合は ス
            キップします( -f と同じ)。 ``Prereq:'' のバージョンが
            正しくない場合は、スキップします。パッチ済みと思わ れ
            る場合は、リバースパッチと仮定します。

       -F number, --fuzz=number
            最大曖昧度を設定します。このオプションは context diff
            形式にのみ適用され、 hunk の適用位置を探す際 に 最 大
            number 行だけ無視します。この値を大きくするとパッチが
            間違ってあたる可能性も増えることに注意して下さい。 デ
            行がなければなりません。

       -n, --normal
            パッチファイルを normal diff 形式として解釈します。

       -N, --forward
            リ バースパッチ、もしくはすでにパッチ済みであると思わ
            れるパッチをスキップします。 -R も参照して下さい。

       -o file, --output=file
            file を出力ファイル名と解釈します。

       -p[number], --strip[=number]
            パス名の除去カウント(strip count)を設定します。パッチ
            作 成 者 と異なるディレクトリにファイルを置いている場
            合、パッチファイル中のパス名をどのように解釈する か、
            を 指示します。除去カウントは、パス名の先頭から何個の
            スラッシュを除去するか、を指定するものです(その間にあ
            るディレクトリ名も取り除かれます)。例えば、パッチファ
            イル中のファイル名が

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

            であった場合、 -p あるいは -p0 オプションを指定 す る
            と、パス名は全く修正されません。 -p1 を指定すると、最
            初のスラッシュがない

                 u/howard/src/blurfl/blurfl.c

            となり、 -p4 を指定すると

                 blurfl/blurfl.c

            、そして -p を全く指定しないと "blurfl.c" と な り ま
            す。ただし、その前のパス(u/howard/src/blurfl)が相対パ
            スとして存在する場合は別で、その場合、パス名全体は 無
            修 正のままです。最後に、こうして得られたファイルを、
            カレントディレクトリあるいは -d オプションで指定し た
            ディレクトリ内で探します。

       -r file, --reject-file=file
            file をリジェクトファイル名として解釈します。

       -R, --reverse
            このパッチが新旧 2 つのファイルを入れ換えて作成したも
            のであることを patch に知らせます。 (ええ、たまにはそ
            う いうことも起きると思っています。人間ってそういうも
            のです。) patch は各 hunk を適用する前に新旧を入れ 換
            え ます。リジェクトファイルは入れ換え後の形式で出力さ
            れます。 -R オプションは ed スクリプト形式の差分に は
            使 えません。逆操作の手順をつくり出すには情報が不足し
            ているからです。

       -s, --silent, --quiet
            エラーの場合以外、静かに処理を行います。

       -S, --skip
            パッチファイル中のこのパッチを無視し、次のパッチか ら
            処理を続けるように指示します。例えば

                 patch -S + -S + <patchfile

            と 指 定すると、3 つのパッチのうち、1 番目と 2 番目の
            パッチを無視します。

       -u, --unified
            パッチファイルを unified diff 形式 (unidiff) として解
            釈します。

       -v, --version
            patch  コマンドのリビジョンヘッダとパッチレベルを表示
            します。

       -V method, --version--control=method
            バックアップファイル名の作成方法として method を用 い
            ま す。 作成されるバックアップのタイプは環境変数 VER-
            SION_CONTROL でも指定できますが、このオプションはそれ
            に 優 先 します。 -B はこのオプションに優先し、バック
            アップファイルを作る際に常にプレフィックスが用いら れ
            るようにします。環境変数 VERSION_CONTROL および -V オ
            プションの引数の指定は、GNU Emacs   の  `version-con-
            trol'  変数と同様です。より分かりやすい同義語も認識さ
            れます。有効な値は以下の通り(一意に短縮するのも可):

            `t' または `numbered'
                   常に数字を付けたバックアップファイルを作 り ま
                   す。

            `nil' または `existing'
                   すでに数字付きバックアップファイルが存在する場
                   合は、数字付きバックアップを行い、それ以外の場
                   合 は、 単純なバックアップを行います。これがデ
                   フォルトです。

            `never' または `simple'
                   常に単純なバックアップを行います。

       -x number, --debug=number
            内部のデバッグフラグに値を設定します。 patch コマンド
            にパッチをあてる人だけに関係するものです。


作者

       Larry Wall <lwall@netlabs.com>
       および多くの貢献者の方々。
       $TMPDIR/patch*


関連項目

       diff(1)


パッチ作成者への注意

       パッチを作って送付しようとする際に留意すべき点がいくつかあ
       ります。第 1 に、patchlevel.h というファイルを管理すること
       で皆は大変幸せになれます。作成したパッチファイルの最初の差
       分はこの patchlevel.h にパッチをあて、パッチレベルをインク
       リメントします。パッチの中に Prereq: 行を入れておけば、 順
       番 通りにパッチを適用しない限り警告が出ます。第 2 に、con-
       text diff ヘッダか Index: 行で正しくファイル名を指定してい
       る こ とを確認して下さい。サブディレクトリにあるファイルに
       パッチをあてようとする場合は、必要に応じて -p オプションを
       指 定するよう、ユーザに伝えて下さい。第 3 に、空のファイル
       と新規ファイルを比較する差分を送付することで、新しいファイ
       ルを生成することができます。これは、ターゲットディレクトリ
       にその新ファイルがまだ存在しない場合にのみ有効です。 第  4
       に、リバースパッチを送付しないように気を付けて下さい。その
       パッチは適用済なのかと皆が混乱します。第 5 に、例えば  582
       個の差分をたったひとつのファイルに突っ込んでハイサヨナラと
       することもできることはできますが、何か発狂しそうになったと
       きに備えて、関係あるパッチをいくつかの独立したファイルにま
       とめあげるほうがおそらく賢明でしょう。


診断

       ここに列挙しきれないほどたくさんありますが、一般 に  patch
       がパッチファイルを解釈できないことを示しています。

       メッセージ "Hmm..." は、パッチファイル中に処理できないテキ
       ストが存在していること、そして patch はそのテキス ト 中 に
       パッチがあるかどうか、もし存在すればどういう形式のパッチで
       あるかを推測しようとしていることを示しています。

       ひとつでもリジェクトファイルが作成されれば、 patch はゼ ロ
       でない終了ステータスで終了します。いくつものパッチを繰り返
       し適用する場合は、この終了ステータスをチェックし、パッチが
       部分的にしか適用されていないファイルに対してさらなるパッチ
       をあてないようにすべきです。


警告

       patched スクリプト形式では行番号のズレを示せません。ま
       た  normal  diff   形 式でも、行番号の誤りを指摘できるのは
       "change" コマンドや "delete" コマンドが現れる場合 だ け で
       す。  context diff 形式で曖昧度 3 を指定した場合も同様の問
       題があります。適切な対話インタフェースが追加されるまでは、
       こういう場合は context diff を見比べて修正が意味的に正しい
       かどうか確認すべきでしょう。もちろん、エラーなくコンパイル
       できれば、パッチはうまく適用されたという小さなサインにはな
       りますが、必ずしもいつもそうだというわけではありません。

       ました」と報告してきます。

       既 に適用済のパッチをあてると、 patch はそれをリバースパッ
       チと考え、適用したパッチを外すかどうか尋ねてきます。これも
       特徴の一つと解釈可能でしょう。



                              LOCAL                      PATCH(1)

ABELNET VPSサービス