このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

パッチの作り方と当て方はこうするもんね

パッチの作り方/当て方を毎回忘れる。だからメモしておこう、っと。単にコマンドのオプションだけでなくて、ファイル/ディレクトリ名とかカレントディレクトリをどこにするかとかで悩むから、これも約束事として決めてしまえ!

foo.txt 変更前:


first line
second line
foo.txt 変更後:

first line
2nd line
third line

hoge/ 変更前:


hoge/
+--- foo.txt

hoge/ 変更後:


hoge/
+--- foo.txt (変更)
+--- bar.txt (新規)


単一ファイルのパッチ

  1. オリジナルファイルには接尾辞".orig"を付けておく。
  2. パッチを作るときも当てるときも、そのファイルがあるディレクトリで作業。
  3. パッチファイル名は、当該ファイル名.日付.diff

パッチ作成:


> diff -u foo.txt.orig foo.txt > foo.txt.20080201.diff

  • diffのオプション -u : unified diff 形式で出力

foo.txt.20080201.diff:


--- foo.txt.orig Fri Feb 1 10:24:39 2008
+++ foo.txt Fri Feb 1 10:41:11 2008
@@ -1,2 +1,3 @@
first line
-second line
+2nd line
+third line

パッチ適用:


> patch < foo.txt.20080201.diff
patching file `foo.txt'

ディレクトリのパッチ

  1. オリジナルディレクトリには接尾辞".orig"を付けておく。
  2. パッチを作るときは、そのディレクトリの親ディレクトリで作業。
  3. パッチを当てるときは、そのディレクトリで作業。
  4. パッチファイル名は、当該ディレクトリ名.日付.diff

パッチ作成:


> diff -Naru hoge.orig hoge > hoge.20080201.diff

  • diffのオプション -N : 存在しないファイルを空ファイルとみなす
  • diffのオプション -a : 全てのファイルをテキストファイルとみなす
  • diffのオプション -r : 再帰的に処理

hoge.20080201.diff:


diff -Naru hoge.orig/bar.txt hoge/bar.txt
--- hoge.orig/bar.txt Thu Jan 1 09:00:00 1970
+++ hoge/bar.txt Fri Feb 1 10:54:30 2008
@@ -0,0 +1 @@
+first line
diff -Naru hoge.orig/foo.txt hoge/foo.txt
--- hoge.orig/foo.txt Fri Feb 1 10:24:39 2008
+++ hoge/foo.txt Fri Feb 1 10:41:11 2008
@@ -1,2 +1,3 @@
first line
-second line
+2nd line
+third line

パッチ適用:


> patch -p1 < hoge.20080201.diff
patching file `bar.txt'
patching file `foo.txt'

  • patchのオプション -p1 :パッチファイル中のファイル名から、最初のスラッシュ「/」とその左の部分を取り去ってファイル名と解釈する。

注意事項

  • 非テキストファイルをパッチの対象にすべきではない。
  • OSの改行コードの相違から、バイナリレベルでみると元ファイルが再現しないことがある。
  • diffとpatchのバージョンによってはうまくいかないことがある。