■
パッチファイルの作成
context 出力形式
$ diff -c original.txt new.txt > patch.txt
unified 出力形式
$ diff -u original.txt new.txt > patch.txt
※ディレクトリを比較する場合、-rNオプションを追加。
例
$ diff -crN old-dir new-dir > patch.txt
パッチの適用
$ patch < patch.txt や $ patch -p0 -E < patch.txt
など。
※ -p"num"で、パッチファイル内の上位ディレクトリ(パス)を削除。
実行例
$ cat original.txt abc $ cat modified.txt abcdef $ diff -u original.txt modified.txt > patch.txt $ cat patch.txt --- original.txt 2009-07-18 09:10:11.000000000 +0900 +++ modified.txt 2009-07-18 09:10:20.000000000 +0900 @@ -1 +1 @@ -abc +abcdef $ patch < patch.txt patching file original.txt $ cat original.txt abcdef
ディレクトリの場合、
$ tree . |-- dir1 | `-- ash.c `-- dir2 `-- ash.c 2 directories, 2 files tree . |-- dir1 | `-- ash.c `-- dir2 `-- ash.c 2 directories, 2 files diff -cr dir1 dir2 > patch.txt cat patch.txt diff -cr dir1/ash.c dir2/ash.c *** dir1/ash.c 2009-07-18 09:25:45.000000000 +0900 --- dir2/ash.c 2009-07-18 09:08:08.000000000 +0900 *************** *** 2,7 **** int main() { ! printf("hello, Mr.Stupid\n"); } --- 2,7 ---- int main() { ! printf("hello, Mr.Perfect\n"); } cd dir1 $ patch -p0 < ../patch.txt can't find file to patch at input line 4 Perhaps you used the wrong -p or --strip option? The text leading up to this was: -------------------------- |diff -cr dir1/ash.c dir2/ash.c |*** dir1/ash.c 2009-07-18 09:25:45.000000000 +0900 |--- dir2/ash.c 2009-07-18 09:08:08.000000000 +0900 -------------------------- File to patch: $ patch -p1 < ../patch.txt patching file ash.c $ cat ash.c #include <stdio.h> int main() { printf("hello, Mr.Perfect\n"); } $