パッチの作り方/当て方を毎回忘れる。だからメモしておこう、っと。単にコマンドのオプションだけでなくて、ファイル/ディレクトリ名とかカレントディレクトリをどこにするかとかで悩むから、これも約束事として決めてしまえ!
例
foo.txt 変更前:
foo.txt 変更後:
first line
second line
first line
2nd line
third line
hoge/ 変更前:
hoge/
+--- foo.txt
hoge/ 変更後:
hoge/
+--- foo.txt (変更)
+--- bar.txt (新規)
単一ファイルのパッチ
- オリジナルファイルには接尾辞".orig"を付けておく。
- パッチを作るときも当てるときも、そのファイルがあるディレクトリで作業。
- パッチファイル名は、
当該ファイル名.日付.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'
ディレクトリのパッチ
- オリジナルディレクトリには接尾辞".orig"を付けておく。
- パッチを作るときは、そのディレクトリの親ディレクトリで作業。
- パッチを当てるときは、そのディレクトリで作業。
- パッチファイル名は、
当該ディレクトリ名.日付.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のバージョンによってはうまくいかないことがある。