|
patch は、テキストファイルにパッチ処理を行うUNIX上のプログラム。「パッチファイル」と呼ばれるファイルに格納された命令群に従ってテキストファイルを更新する。パッチファイル(単にパッチとも呼ばれる)自体もテキストファイルであり、diff を使って元のファイルと更新後のファイルの差分をとることで作成される。パッチによるファイルの更新を「パッチを当てる」などという。
歴史patch を最初に作ったのは(後に Perl を開発した)ラリー・ウォールであり、彼はそれを1985年5月にmod.sources へポストした(後に comp.sources.unix となった)。このプログラムはGNUプロジェクトの一部となり、フリーソフトウェア財団が保守している。 使用法patchはプログラマの間でのやり取りのために作られ、ソースコードの更新のためによく用いられている。そのため、パッチソフトと言えばプログラムに使うものという先入観がある人が多いが、実際にはあらゆるテキストに適用可能である。パッチソフトは「当て布」という本来の語義に反して、テキストの追加のみでなく削除も行うことができる。なおpatchは、バイナリ形式のパッチを扱うプログラムではない。 ソフトウェア開発におけるパッチpatch への入力となる diff ファイルは読み取り可能なテキストファイルであり、使う前に人間が中身を確かめることが容易である。より進んだ diff を使った場合、パッチ適用前に独自に修正されたファイルにもパッチを適用可能である(それらの修正が patch を妨げない限り)。これは例えば "context diff" や "unified diff" を使う場合である。これらの diff は変更箇所の前後の文脈(コンテキスト)も diff の一部として示す。patch はそれらの情報を使って、行番号がずれていてもパターンマッチングによってパッチ適用箇所を特定する(もちろん、最初は行番号を使ってパッチを適用しようと試みる)。 "context diff" や "unified diff" は行番号に依存しないのでパッチに適している。"unified diff" 形式は慣れていないと読みにくく、"context diff" の方が分かりやすい。ただし、"unified diff" の方が非常にコンパクトになる。 diff プログラム以外にも diff 形式のファイルを生成するプログラムがある。例えば、Subversion、CVS、RCS である。 フリーソフトウェアの世界では、diff と patch を使って修正をやり取りするのが一般的である。あるフリーソフトウェアのソースを外部の者がダウンロードし、修正を加え、それを diff 形式でチームに送る。そうすると、チームメンバーはそれをパッチとして適用する前にレビューでき、外部の者がアクセスできるソースではなく、開発中の最新のソースにパッチを適用することで修正を取り込むことができる。 CVS などのバージョン管理システムでもパッチは重要な要素である。 使用例パッチを適用するには、以下のコマンドをシェル上で実行する。 $ patch < mods.diff これはつまり、パッチファイル mods.diff にはパッチを適用すべきファイルが何であるかが書かれていることを意味する。サブディレクトリにあるファイルへのパッチ適用には -pnumber オプションを必要とし、ソースツリーのベースディレクトリがパッチファイルに含まれている場合は number に 1、さもなくば 0 を指定する。 パッチを適用前の状態に戻すには '-R' オプションを使用する。 $ patch -R < mods.diff diff を適用したバージョンとパッチを適用しようとしているバージョンが異なる場合、パッチは正しく適用できない。例えば、テキストの先頭に行が挿入されていると、パッチファイル内の行番号が正しくなくなる。patch はパターンマッチングで修正する前後の行を特定するため、ある程度これに対処できる。また修正箇所近辺の内容が違っている場合も対処可能である(fuzz)。ただし、独自の修正を加えられたソースにパッチを適用して正しく動作するかは保証されない。 移植UNIX系システムが起源だが、patch はMicrosoft Windowsなどにも移植されている。Windows 版の patch は GNU utilities for Win32 にある。 関連項目外部リンク
|
This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.
Mercedes Car
This site monitored by SitePinger.net