今更ですが、パッチ(Patch)の当て方について

Pocket

最近は、プログラムの修正などはファイルを更新(アップデート)して完了させることが多いですね。
わざわざpatchを当てるくらいなら、何故、git使わないだ?という声もあるでしょう。
正直、需要が乏しい所でもありますね。
でも、今回は敢えてpatchについて、メモを残しておきます。

Patchとは

面倒なんで、Wiki調べてください。
https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%83%E3%83%81

差分ファイルを作って、それをもってファイルの更新を行う方法になります。
更新後に問題があった場合には、Patchを戻すことも可能です。

今回、私が出くわした状態は、ファイルを更新して欲しいという要望でした。
完全に更新すれば必ず動く!という保証付きならば良かったのですが、実際には間違っていた部分もあって、元に戻さないといけない可能性がありました。
当然、バックアップを取ってから更新するということも考えたのですが、そこそこの数があったので、どうたものかと悩んだ挙句、少し時間は掛かるものの、patchによる適用とバックオン可能な状況を選択しました。

悲しいかな、gitを適用してなかったのがいけないんですけどね(^^ゞ

差分の確認

patchは差分情報により、更新対象となるファイルを更新するとともに、最悪場合は元に戻すことが出来ます。
Linuxでは、patchコマンドに差分情報を与えることで、ファイルの更新を行うことになります。
この差分を確認するコマンドは、ご存知のdiffコマンドです。

# diff old.txt new.txt

これで、old.txtとnew.txtの差分を標準出力に出力することが可能です。

patchファイルの作成

patchファイルの作成には、このdiffコマンドを使用します。
具体的には以下のコマンドです。

# diff -up old.txt new.txt

ファイル単位で行うには、このコマンドで差分情報が標準出力に表示されます。
実際にpatchファイルを作成するには、以下の様にリダイレクトを使って標準出力をファイルに出力します。

# diff -up old.txt new.txt > file.patch

とすることで、patchファイルが作成されます。

patchの適用をする際には、このファイルを利用して以下の様に適用します。

# patch new.txt < file.patch

これで終わりです。
元に戻す場合には、以下のコマンドを使用します。

# patch -R new.txt < file.patch

でも、一つ一つのファイルに適用するのは面倒ですね。
patchコマンドは、ディレクトリ単位の更新にも対応しています。

まずは、差分情報の作成から行いましょう。

diff -uprN old_dir new_dir > dir.patch

更に適用するには以下のコマンドで適用します。

patch -p1 new_dir < dir.patch

元の状態に戻す場合も同様に、以下のコマンドを使用します。

patch -R -p1 new_dir < dir.patch

更新対象のファイルが実行ディレクトリにある場合や、ディレクトリが実行ディレクトリにある場合には、ファイル名やディレクトリ名を省略することが可能です。
でも、明示的に行う方が、間違いが無くて良いですよね。

patchコマンドの詳しいオプションに関してはヘルプを参照するとか、他のブログを参考にしてください。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください