patch (パッチ)とは
`patch`は、テキストファイルに対して
パッチ処理を行う
UNIXベースのプログラムです。主に、`diff`コマンドで生成される「
パッチファイル」という差分情報が記述されたファイルを基に、テキストファイルの更新を行います。
パッチファイル自体もテキスト形式であり、変更前のファイルと変更後のファイルとの差分を記録したものです。
パッチによるファイル更新は「
パッチを当てる」と表現されます。これは、変更箇所に「当て布」をするというイメージから来ています。
歴史
`patch`は、
Perl言語の開発者としても知られる
ラリー・ウォール氏によって1985年5月に開発されました。その後、
GNUプロジェクトの一部となり、現在は
フリーソフトウェア財団がメンテナンスを行っています。
使用法
`patch`は、プログラマー間でのソースコードのやり取りによく利用されますが、実際にはあらゆるテキストファイルに適用可能です。
パッチは、テキストの追加だけでなく、削除も行うことができます。ただし、バイナリ形式の
パッチを扱うことはできません。
ソフトウェア開発におけるパッチ
`patch`への入力となる`diff`ファイルはテキスト形式で可読性が高く、適用前に内容を確認できます。コンテキスト形式(`diff -c`)やユニファイド形式(`diff -u`)といった詳細な差分形式を使用すると、
パッチ適用前に修正されたファイルにも適用が可能です。これらの形式は、変更箇所の前後の文脈も含むため、行番号がずれていても、パターンマッチングによって適用箇所を特定できます。
ユニファイド形式はコンパクトで多くのオープンソースプロジェクトで推奨されています。diff形式のファイルは、
Git, Subversion, CVS, RCSなど'>[バージョン管理システム]でも生成でき、
パッチはバージョン管理においても重要な役割を果たします。
オープンソース開発では、修正内容を`diff`で
パッチファイルとしてやり取りし、レビュー後に
パッチを適用して最新のソースコードに反映させることが一般的です。
使用例
ファイル単位でのパッチ適用
パッチファイル作成:
bash
diff -u 元ファイル 変更後ファイル >
パッチファイル名.patch
パッチ適用:
bash
patch <
パッチファイル名.patch
パッチファイルには適用すべきファイル名が記述されているため、コマンドでファイル名を指定する必要はありません。`-R`オプションを使用すると、
パッチ適用前の状態に戻すことができます。
bash
patch -R <
パッチファイル名.patch
パッチ適用時に、適用しようとするファイルが、`diff`作成時のファイルと異なる場合、
パッチは正しく適用できません。例えば、適用しようとしているテキストの先頭に行が挿入されていると、
パッチファイル内に書かれている行番号が一致しなくなるためです。
`patch`は、パターンマッチングで修正箇所を特定するため、多少の変更には対処できます。ただし、独自の修正が加えられたソースコードへの
パッチ適用は、正常な動作が保証されない場合があります。
フォルダ単位でのパッチ適用
フォルダ単位で
パッチを作成し、元に戻す手順は以下の通りです。
bash
diff -ur 元フォルダ 変更後フォルダ >
パッチファイル名.patch
サブディレクトリにあるファイルへの
パッチ適用には、`-pnumber`オプションが必要です。ソースツリーのベースディレクトリが
パッチファイルに含まれている場合は`number`に`1`、そうでない場合は`0`を指定します。例えば、gitで作成された
パッチを適用する場合は、`patch -p1 <
パッチファイル名.patch`とします。
移植
`patch`は、
UNIX系システム以外にも、
Microsoft Windowsなど様々な環境に移植されています。Windows版の`patch`は、GNU utilities for Win32に含まれています。ただし、Windows
Vista以降では、プログラム名に`patch`が含まれると
マルウェアと判断されることがあるため、UACに対応したバージョンを利用する必要があります。
関連項目
- - パッチ
- - diff
- - rsync
- - xdelta
外部リンク