diff/patch Tips

Copyright (c) 2001 Koichi OKADA
まず「取扱説明書」をお読みください。

はじめに

diff/patch とは

diff というのはファイルの差分を作成するツール、 patch というのはファイルの差分からファイルの変更を再現するツールです。 通常 diff で作った差分ファイルをパッチ(ばんそうこう)と呼びます。

ライセンス

多分、気にしなくて良いです。

準備

UNIX の場合

通常 UNIX には diff と patch は標準で入っています。 特に準備はいらないはずです。

Windows の場合

一番手っ取り早いのはcygwinを入れることです。

cygwin はでか過ぎるとか cygwin はちょっとって言う人は vector辺りで win32 native な rcs/diffpatch を 取って来るというのも手です。

Mac の場合

分かりません:-P。 Mac OS X を使いましょう(Mac OS X は UNIX です)。

パッチの作成

パッチは diff を用いることで作成できます。 この際 -c オプションを付けるほうが良いようです。 -c オプションを付けると変更部分の前後関係も記録する context 形式の差分が作成されるため より正確にパッチを適用できます。

ファイル単位のパッチ作成

1ファイル毎にパッチを作成するには以下のようにします。 FROM_FILE の所に変更前のファイル名、 TO_FILE の所に変更済みのファイル名、 PATCH_FILE の所に作成するパッチのファイル名を書きます。

diff -c FROM_FILE TO_FILE > PATCH_FILE

ディレクトリ単位のパッチ作成

ディレクトリの中にある複数のファイルに対して 一度にパッチを作成するには以下のようにします。 FROM_DIRECTORY の所に変更前のファイルが入っているディレクトリ名、 TO_DIRECTORY の所に変更済みのファイルが入っているディレクトリ名、 PATCH_FILE の所に作成するパッチのファイル名を書きます。

diff -c FROM_DIRECTORY TO_DORECTORY > PATCH_FILE

ディレクトリ以下を全てパッチ作成

ディレクトリ以下のファイル全てについてパッチを作成する場合は以下のようにします。

diff -cr FROM_DIRECTORY TO_DORECTORY > PATCH_FILE

-r オプションを加えるとディレクトリ以下を階層的に検索してくれます。

ディレクトリ単位のパッチ(追加/削除ファイルも記録)

上記の方法では一方にしか存在しない、つまり追加または削除されたファイルは 記録されません。 追加または削除されたファイルも記録するためには以下のようにします。

diff -crN FROM_DIRECTORY TO_DORECTORY > PATCH_FILE

-N オプションは、 ディレクトリを比較する際、片方のディレクトリにのみファイルが存在していたら もう片方のディレクトリには同名の空っぽのファイルがあるように動作します。

パッチの適用

パッチは patch を用いることで適用できます。

ファイル単位のパッチ

適用したいファイルの存在するディレクトリ上で以下のようにします。 変更前のファイルはファイル名末尾に .org が付加されて保存されます。

patch < PATCH_FILE

ディレクトリ単位のパッチ

パッチを作成したときと相対的に同じディレクトリにて以下のようにします。

patch -p0 -d . < PATCH_FILE

-p オプションは差分作成時の相対ディレクトリを有効にします (-p がないと全てのファイルがカレントディレクトリにあると仮定されます)。 -p の後ろの 0 は 差分ファイルに記録されている相対ディレクトリを全て有効にするという意味です。 1、2 と増えていくと、記録された相対ディレクトリが頭から1つづつ削られます (例 : -p1 だと usr/local/src → local/src、-p2 だと usr/local/src → src)。

-d オプションはパッチを適用するディレクトリを指定します (カレントディレクトリに適用するなら無くても良いです)。

ディレクトリ単位のパッチ(追加/削除ファイルの再現)

上記の方法では、ファイルの追加はされても削除が行われません。 ファイルの削除も再現するには以下のようにします。

patch -p -d . -E < PATCH_FILE

-E オプションはパッチ適用後、空のファイルは削除するようにします。

用語

パッチファイル
ファイルの変更点を記録したファイルです。 作成する方法はいくつかありますが、 最も一般的なのは diff コマンドにより作成し、 patch コマンドにより変更を再現することです。 例えばネット等に流通しているファイルに変更を加えた際、 同様の変更を(自分または第三者が)自動的かつ容易に行う事ができます。 またファイルの変更点だけを配布できるので配布するファイルがコンパクトになります。

diff/patch に関する情報源

diff
patch

連絡先

ご意見・ご感想は こちらのアドレス までお願いします。


[Made with CSS] [Valid HTML 4.01!] [Valid CSS!] [ Check This HTML ] [PNG NOW!]