Pages

2009年9月17日 星期四

diff && patch

  這兩個指令一起使用等同於大陸人所說的「補丁」,目的就是當程式有新版的時候,用來替換舊版的做法之一,如果一個專案有需要多人一起修改,使用 patch 配合有意義的檔名,如:camera_preview.patch 會變得比較好管裡,因為可以掌握到底改過哪些地方。

首先,假設有兩個資料夾:
-baijuyi- [/home/Bachelor_91/linly/old] -13:48- ls
a.cc git
-baijuyi- [/home/Bachelor_91/linly/old] -13:48- cat a.cc
#include <iostream>

using namespace std;

int main()
{
a = 3;
}
-baijuyi- [/home/Bachelor_91/linly/new] -13:49- ls
a.cc git
-baijuyi- [/home/Bachelor_91/linly/new] -13:49- cat a.cc
#include <iostream>

using namespace std;

int main()
{
b = 3;
}
  在兩個資料夾都有 a.cc 和 git,而 new 資料夾的 a.cc 檔案中,把 a = 3; 改成 b = 3;,現在要做 patch:
-baijuyi- [/home/Bachelor_91/linly] -13:52- diff -ruN old/ new/ -x git > my.patch
-baijuyi- [/home/Bachelor_91/linly] -13:53- cat my.patch
diff -ruN -x git old/a.cc new/a.cc
--- old/a.cc 2009-09-17 13:48:36.000000000 +0800
+++ new/a.cc 2009-09-17 13:48:04.000000000 +0800
@@ -4,5 +4,5 @@

int main()
{
- a = 3;
+ b = 3;
}
  其中有一個參數:-x git,是省略這個檔案不比,有時候會有一些說明檔在裡頭,沒有必要去 patch 它。接著就是打 patch:
-baijuyi- [/home/Bachelor_91/linly] -13:59- patch -p0 < my.patch
-baijuyi- [/home/Bachelor_91/linly] -14:16- cat old/a.cc
using namespace std;

int main()
{
b = 3; // =>改變了
}
  這樣就完成程式碼的更新了,如果說我到 old/ 這個資料夾打 patch 的話,由於是往下一層,所以要把 -p0 改成 -p1。最後,因為我的用 patch,它會幫我把原先的舊檔案,以原檔名加上 .orig,所以想把這些檔案都刪除的話,可以利用 find 去做:
-baijuyi- [/home/Bachelor_91/linly] -14:03- ls old/
a.cc a.cc.orig git
-baijuyi- [/home/Bachelor_91/linly] -14:03- find . -name '*.orig' -exec rm -f {} ';'
-baijuyi- [/home/Bachelor_91/linly] -14:03- ls old/
a.cc git

3 則留言:

Eric 提到...

patch 另外有兩個可能用的到的參數:
1. -E:patch 的檔案為空就捨棄
2. -R:恢復 patch 前的狀態

Unknown 提到...

如果是要協同開發,為什麼不直接用版本控制@@? 看到你資料夾名稱取 git 還以為你要用 git XD

用 patch 感覺看不到時間軸,用版本控制可以整個時間軸都出來,要發展新的 branch 也方便些,要針對個版本產生 patch 檔也很方便!!

Eric 提到...

那個 git 寫好玩的,哈哈!在我們這邊,有個「SI Team」會用 SVN+Trac 做版本控制,至於其它人就每周交 patch 給他們。

 
Blogger Templates