理工系研究者のための Mac OS X, Windows, Linux メモ
 
ホーム >> UNIX >> diff&patch
このエントリーをはてなブックマークに追加

diff と patch についてのメモ

オリジナルのファイル main.c.org と修正後のファイル main.c との差分を採ってパッチを作るとする。 diff コマンドにはいくつかオプションがあり、パッチを作るときには context 形式か unified形式を使う。

もしオプション無しで差分を採ると、差分ファイルにファイル名に関する情報が残らない。

$ diff main.c.org main.c
16,17c16,17
<   printf("Patch test.");
<   func(&temp);
---
>   func(&temp);
>   printf("temp.a[30]= %e\n",temp.a[30]);
context形式で差分を採ると、ファイル名の情報と変更部分の前後の行まで含まれる。
$ diff -c main.c.org main.c
*** main.c.org	Sun Feb 15 21:59:35 2004
--- main.c	Sun Feb 15 22:33:00 2004
***************
*** 13,20 ****
    for(i=0;i<100;i++) {
      temp.a[i]=i;
    }
!   printf("Patch test.\n");
!   func(&temp);
    return 0;
  }
	  
--- 13,20 ----
    for(i=0;i<100;i++) {
      temp.a[i]=i;
    }
!   func(&temp); 
!   printf("temp.a[30]= %e\n",temp.a[30]);
    return 0;
  }
unified形式で差分を採ると、次のようになる。
$ diff -u main.c.org main.c
--- main.c.org	Sun Feb 15 21:59:35 2004
+++ main.c	Sun Feb 15 22:33:00 2004
@@ -13,8 +13,8 @@
   for(i=0;i<100;i++) {
     temp.a[i]=i;
   }
-  printf("Patch test.\n");
-  func(&temp);
+  func(&temp);
+  printf("temp.a[30]= %e\n",temp.a[30]);
   return 0;
 }
最後の unified形式は比較的コンパクトで且つ読みやすい形式になる。

パッチを作るには、出力をファイルに出せば良い。

$ diff -u main.c.org main.c > main.patch

この main.patch を用いて古い状態のファイル main.c にパッチを当てるには、 main.c のあるディレクトリで

$ patch < main.patch
と打てば良い。 オプション -C を付けるとパッチを実行せずに動作を確認することが出来る。 パッチファイルの差分部分よりも前方に説明文などを追加することが出来る。 その先頭部分は無視して、適切に差分部分を判定してパッチを当てることが出来る。

参考: diff/patch Tips(リンク切れ)
UNIXの部屋(リンク切れ)