diff/patch とは
diff は、ファイルの差分を作成するコマンドで、 patchは、差分からファイルの変更を再現するコマンドです。
Linuxの場合、様々なサーバアプリケーションや、ソフトウエアがソースで提供されているため、自分の環境に合った仕組みに改造したり、Linuxユーザの手によって、使いやすく改良したり、本家(提供元)が修正する前に、ユーザーの手によってバグや問題を改善してきました。
しかし、毎回、何処を修正しましたと報告しても、プログラムソースを読めない人では、それを反映することは難しいでしょう。
そこで、このdiff と patchが使われてきました。
オリジナルのソースファイルから、 diff を使用して差分ファイルを作っておけば、そのオリジナルソースに patchコマンドを実行するだけで、修正した箇所が再現出来ます。
このdiffとpatchを使いこなせれば、オリジナルソースに手を加えて、パッチを公開するなんてのも簡単に実現できます。
オプションの説明
-c 変更部分の前後関係も記録する (視覚的にもわかりやすくなる)
-r ディレクトリ以下を階層的に検索してくれます。
-N ディレクトリを比較する際、片方のディレクトリにのみファイルが存在していたらもう片方のディレクトリには同名の空っぽのファイルがあるように動作します。
ファイル単位のパッチ作成
1ファイル毎にパッチを作成するには以下のようにします
ディレクトリ単位のパッチ作成
ディレクトリの中にある複数のファイルに対して一度にパッチを作成するには以下のようにします
ディレクトリ以下を全てパッチ作成
ディレクトリ以下のファイル全てについてパッチを作成する場合は以下のようにします。
ディレクトリ単位のパッチ(追加/削除ファイルも記録)
上記の方法では一方にしか存在しない、つまり追加または削除されたファイルは記録されません。追加または削除されたファイルも記録するためには以下のようにします
パッチの適用
patchを適用させることを、パッチを充てる(あてる)等と言います。
オプションの説明
-p 差分作成時の相対ディレクトリを有効にします。
-pが無い時は、全てのファイルが、カレントディレクトリにあると仮定します。
また、-p0 -p1 のように一つづつ増やすことで、記録されている相対ディレクトリが頭から1づつ削られます。
たとえば、/usr/local/src で diffを実行し、patchを作成した場合、/usr/local/src/の同じ場所でパッチを適用する場合は、-p0ですが、一段入って、/usr/local/src/app/でパッチを適用する場合は、-p1とすれば、いいわけです。
-d 適用するディレクトリを指定できます。
-E 適用後、空になったファイルを削除するようにします。
ファイル単位のパッチ
適用したいファイルの存在するディレクトリ上で以下のようにします
ディレクトリ単位のパッチ
パッチを作成したときと相対的に同じディレクトリにて以下のようにします
ディレクトリ単位のパッチ(ディレクトリ指定)
パッチを作成したときと相対的に同じディレクトリにて以下のようにします
ディレクトリ単位のパッチ(ファイルの削除対応)
パッチを作成したときと相対的に同じディレクトリにて以下のようにします
diff は、ファイルの差分を作成するコマンドで、 patchは、差分からファイルの変更を再現するコマンドです。
Linuxの場合、様々なサーバアプリケーションや、ソフトウエアがソースで提供されているため、自分の環境に合った仕組みに改造したり、Linuxユーザの手によって、使いやすく改良したり、本家(提供元)が修正する前に、ユーザーの手によってバグや問題を改善してきました。
しかし、毎回、何処を修正しましたと報告しても、プログラムソースを読めない人では、それを反映することは難しいでしょう。
そこで、このdiff と patchが使われてきました。
オリジナルのソースファイルから、 diff を使用して差分ファイルを作っておけば、そのオリジナルソースに patchコマンドを実行するだけで、修正した箇所が再現出来ます。
このdiffとpatchを使いこなせれば、オリジナルソースに手を加えて、パッチを公開するなんてのも簡単に実現できます。
オプションの説明
-c 変更部分の前後関係も記録する (視覚的にもわかりやすくなる)
-r ディレクトリ以下を階層的に検索してくれます。
-N ディレクトリを比較する際、片方のディレクトリにのみファイルが存在していたらもう片方のディレクトリには同名の空っぽのファイルがあるように動作します。
ファイル単位のパッチ作成
1ファイル毎にパッチを作成するには以下のようにします
#diff -c <元ファイル名> <修正後ファイル名> > <パッチファイル>
ディレクトリ単位のパッチ作成
ディレクトリの中にある複数のファイルに対して一度にパッチを作成するには以下のようにします
#diff -c <元フォルダ> <修正後フォルダ> > <パッチファイル>
ディレクトリ以下を全てパッチ作成
ディレクトリ以下のファイル全てについてパッチを作成する場合は以下のようにします。
#diff -cN <元フォルダ> <修正後フォルダ> > <パッチファイル>
ディレクトリ単位のパッチ(追加/削除ファイルも記録)
上記の方法では一方にしか存在しない、つまり追加または削除されたファイルは記録されません。追加または削除されたファイルも記録するためには以下のようにします
#diff -crN <元フォルダ> <修正後フォルダ> > <パッチファイル>
パッチの適用
patchを適用させることを、パッチを充てる(あてる)等と言います。
オプションの説明
-p 差分作成時の相対ディレクトリを有効にします。
-pが無い時は、全てのファイルが、カレントディレクトリにあると仮定します。
また、-p0 -p1 のように一つづつ増やすことで、記録されている相対ディレクトリが頭から1づつ削られます。
たとえば、/usr/local/src で diffを実行し、patchを作成した場合、/usr/local/src/の同じ場所でパッチを適用する場合は、-p0ですが、一段入って、/usr/local/src/app/でパッチを適用する場合は、-p1とすれば、いいわけです。
-d 適用するディレクトリを指定できます。
-E 適用後、空になったファイルを削除するようにします。
ファイル単位のパッチ
適用したいファイルの存在するディレクトリ上で以下のようにします
#patch < <パッチファイル>
ディレクトリ単位のパッチ
パッチを作成したときと相対的に同じディレクトリにて以下のようにします
#patch -p0 < <パッチファイル>
ディレクトリ単位のパッチ(ディレクトリ指定)
パッチを作成したときと相対的に同じディレクトリにて以下のようにします
#patch -p0 -d /usr/local/src/ < <パッチファイル>
ディレクトリ単位のパッチ(ファイルの削除対応)
パッチを作成したときと相対的に同じディレクトリにて以下のようにします
#patch -p0 -E < <パッチファイル>
この記事にコメントする