patchは、パッチファイルと呼ばれる別のファイル内の指示に従ってテキストファイルを更新するシェルコマンドです。パッチファイルは、入力ファイルと目的の内容との差異をリストしたテキストファイルです。このコマンドは、 を介して作成されたパッチファイルをサポートするように設計されています。ユーザーは、ファイルの 2 つのバージョン (オリジナルとターゲット) に対して を実行することでパッチファイルを作成します。これにより、後でオリジナルファイルとパッチファイルからターゲットファイルを生成するために使用できる差異のリストが生成されます。パッチという用語は、パッチを適用する動詞としても使用されます。diffdiffpatch
プログラマーが他のプログラマーのために開発したパッチは、ソースコードを新しいバージョンにpatch更新するためによく使われていました。そのため、多くの人がパッチをソースコードと結びつけて考えるようになりましたが、実際にはパッチはあらゆるテキストに適用できます。パッチを適用したファイルには不要なテキストが蓄積されるわけではありません。これは、パッチという言葉の英語の意味から誤解される点です。パッチはテキストを追加するだけでなく、削除することも可能です。
ここで説明するパッチは、バイナリパッチと混同してはいけません。バイナリパッチは概念的には似ているかもしれませんが、プログラムを構成するバイナリファイルを新しいリリースに更新するために配布されるものです。
オリジナルのpatchプログラムはラリー・ウォール(後にPerlプログラミング言語を作成した人物)によって書かれ、 1985年5月にmod.sources[ 1 ](後に)に投稿されました。はXPG4に追加され、後にPOSIXになりました。[ 2 ]ウォールのコードは、 OpenBSD、[ 3 ] FreeBSD、[ 4 ]およびschilytools [ 5 ]で提供されている「パッチ」プログラムの基礎となっています。オープン・グループに統合されたオープン・ソフトウェア財団は、派生バージョンを維持していると言われています。GNUプロジェクト/ FSFは、ラリー・ウォールのバージョンからフォークしたパッチを維持しています。リポジトリはGNU diffutilsとは異なりますが、ドキュメントは一緒に管理されています。[ 6 ]元々はUnix用に書かれたこのコマンドは、 Windows(GnuWin32およびUnxUtils経由)や他の多くのプラットフォームにも移植されています。実装はASCIIのMSX-DOS2 Tools for MSX-DOSバージョン2の一部である。 [ 7 ]comp.sources.unixpatch
パッチファイルはテキストファイルであるため、品質レビューやテキストエディタによる修正などのプロセスで使用できます。
このコマンドに加えて、 Subversion、CVS、RCS、Mercurial、Gitdiffなどの他のプログラムによってもパッチファイルを作成できます。
パッチは、 CVSを含む多くのソースコード管理システムの重要な構成要素となっている。
より高度な差分表示を使用すると、パッチは、その間に変更されたファイルにも適用できます。ただし、その変更がパッチの適用を妨げないことが条件です。これは、「コンテキスト差分」と「統合差分」(「unidiff」とも呼ばれます)を使用することで実現されます。これらの差分表示では、変更箇所の直前と直後のテキストであるコンテキストで各変更箇所が囲まれます。パッチはこのコンテキストを使用して、差分表示の行番号を起点として、パッチを適用する領域を特定できます。たとえ、ファイル内の以前の変更によってパッチ適用箇所が移動していたとしても、特定可能です。このような特性から、コンテキスト差分と統合差分は、多くのソフトウェアプロジェクトへの提出において、パッチの推奨形式となっています。
上記の特徴により、diffとpatchはオープンソースソフトウェアの変更点を交換する際に特に人気があります。外部の開発者は、公開されている最新のソースコードをダウンロードし、変更を加えて、diff形式で開発チームに送信できます。diffを使用することで、開発チームはパッチを適用する前に効果的にレビューでき、外部の開発者がアクセスできたコードベースよりも新しいコードベースにパッチを適用できます。
以下のコマンドは、からpatchFileを生成する方法をエンコードしたパッチファイルを作成します。オプションは、出力を統一差分形式で選択することを選択します。newFileoldFile-u
$ diff -u oldFile newFile > patchFile 以下のコマンドは、で指定されたファイルに変更を適用しますpatchFile。
$ patch < patchFile サブディレクトリ内のファイルをパッチするには、追加オプションが必要です。この番号は、ソースツリーのベースディレクトリが差分に含まれる場合は 1、そうでない場合は 0 になります。-pnumber
パッチは、以下の-Rオプションで元に戻すことができます。
$ patch -R < patchFile オリジナルとして使用されるファイルが実際のオリジナルファイルと大きく異なる場合、パッチをきれいに適用することはできません。たとえば、先頭にテキスト行が挿入された場合、パッチで参照される行番号は正しくありません。 は、patch近くの行を調べてパッチを適用するテキストの位置を再配置することで、この問題から回復できます。また、コンテキスト行(コンテキストと統合差分用)が変更された場合にも回復できます。これはファジーと呼ばれます。