- 為什麼要 patch?
1. 檔案( 版本 )之間的差異,可以指令 diff 儲存在一個 patch 檔案。
2. 若舊版本需要修改,只要將 patch 檔案釋出。
3. 使用者可以指令 patch,配合 patch 檔案中記錄之新舊版差異,將舊版程式更新。
4. 使用者若發現並修正一個程式的臭蟲,簡單、正確的方式是,寄一個 patch 檔案給作者,而不要只是說明修正的地方。
- diff 指令:比對兩個檔案之間的差異,一般是用在 ASCII 純文字檔的比對上。
diff 指令用法:
[root@linux ~]# diff [-bBiqn] from-file to-file
選項:
from-file :檔名,作為原始比對檔案的檔名;
to-file :檔名,作為目的比對檔案的檔名;
# from-file 或 to-file 可以 - 取代, - 代表『Standard input』。
-b :忽略一行當中,多個空白的差異
(例如 "about me" 與 "about me" 視為相同)
-B :忽略空白行的差異。
-i :忽略大小寫的不同。
-q :只列出檔案是否有差異。
-n :以 RCS 格式輸出檔案之差異。
-c (-C NUM) :兩個檔案皆加入差異部分前後 NUM 行,以增加輸出之可讀性。預設 NUM=3。
-u (-U NUM) :加入差異部分前後 NUM 行,以增加輸出之可讀性。預設 NUM=3。
- patch:檔案補丁。需與 diff 配合使用
[root@linux ~]# patch [OPTION]... [ORIGFILE [PATCHFILE]]
選項:
-pNUM :取消 NUM 層目錄。
例如:假設檔名 /u/howard/src/blurfl/blurfl.c
-p0 :代表 u/howard/src/blurfl/blurfl.c
-p4 :代表 blurfl/blurfl.c
-l :忽略空白之差異。
-i PATCHFILE :從 PATCHFILE 讀取補丁。
-o FILE :輸出補丁到檔案 FILE。
-r FILE :輸出錯誤到檔案 FILE。
# 預處理:建立兩個不同版本的檔案 /tmp/test/passwd 與 /etc/passwd。
[root@dywHome2 ~]# mkdir /tmp/old; cp /etc/passwd /tmp/old
[root@dywHome2 ~]# mkdir /tmp/new; cp /tmp/test/passwd /tmp/new
# 建立補丁檔案 /tmp/test.patch 記錄新舊檔案之間的差異。
[root@dywHome2 ~]# cd /tmp ; diff old/ new/ > test.patch
# diff 製作檔案時,舊的檔案必須是在前面,亦即是 diff oldfile newfile。
# 將舊的內容 (/tmp/old/passwd) 更新到新版 (/tmp/new/passwd) 的內容
[root@dywHome2 tmp]# cd /tmp/old
[root@dywHome2 old]# patch passwd -i /tmp/test.patch
patching file passwd
# 選項 -i 亦可省略
# 更新內容,並指定存於 passwd1
[root@dywHome2 old]# patch passwd /tmp/test.patch -o passwd1
patching file passwd
# 內容已更新,若再做一次補丁,系統會詢問是否執行?
1. 預設回答 n(o):系統會將錯誤訊息存在 passwd.rej
[root@dywHome2 old]# patch passwd -i /tmp/test.patch
patching file passwd
Reversed (or previously applied) patch detected! Assume -R? [n] n
Apply anyway? [n] n
Skipping patch.
2 out of 2 hunks ignored -- saving rejects to file passwd.rej
2. 回答 y(es):系統會將更新後的內容存在 passwd.orig
[root@dywHome2 old]# patch passwd -i /tmp/test.patch
patching file passwd
Reversed (or previously applied) patch detected! Assume -R? [n] y
3. 查詢檔案
[root@dywHome2 old]# ll passwd*
-rw-r--r-- 1 root root 1207 Apr 16 13:14 passwd
-rw------- 1 root root 1156 Apr 16 13:10 passwd1
-rw-r--r-- 1 root root 1156 Apr 16 13:11 passwd.orig
-rw-r--r-- 1 root root 149 Apr 16 13:12 passwd.rej
˙實例:
假設我們有兩個檔案,分別是 expatch.old 與 expatch.new ,他們的內容是這樣的:
[root@linux ~]# vi expatch.old
echo "check your postfix's body and header drop settings"
echo "postmap -q - regexp:header_checks <>
兩個檔案的不同點在於:
[root@linux ~]# diff expatch.old expatch.new
2c2
<> echo "postmap -q - regexp:header_checks <> echo "postmap -q - regexp:body_checks <>
上面顯示出兩個檔案的不同點。假如我以『 diff -c expatch.old expatch.new 』以及上面顯示的資訊,做成一個檔案,內容是這樣的:
[root@linux ~]# diff -Naur expatch.old expatch.new > expatch.patch
[root@linux ~]# vi expatch.patch
--- expatch.old 2005-09-30 15:47:54.000000000 +0800
+++ expatch.new 2005-09-30 15:48:06.000000000 +0800
@@ -1,5 +1,5 @@
echo "check your postfix's body and header drop settings"
-echo "postmap -q - regexp:header_checks <>
注意到,這個檔案的第一行顯示出舊版本的檔名,而第二行則為新版本的檔名與時間, 第三行以後則是兩個檔案的差異性。那麼我們將以 patch 來進行更新,將 expatch.old 更新到 expatch.new 看看。patch 的基本語法是這樣的:
patch -p數字 <>[root@linux ~]# patch -p0 <>
# 注意喔,這個時候我的工作目錄底下會存在 expatch.old 才對!
# 然後立刻察看一下,您會發覺, expatch.new 與 expatch.old 變成一模一樣的了!
很容易瞭解吧!
[ref] : patch程式
鳥哥的 Linux 私房菜 - 利用 patch 更新原始碼
沒有留言:
張貼留言