在以前的軟體原始碼包,需要打補丁的時候比較多。現在的原始碼包很少進行打補丁了,因為根據需求安裝不同的版本即可,比較商業化了。(也就是知道如何給原始碼包打補丁就可以了,瞭解即可。)
從開發者的角度,補丁就是軟體新版本和現有版本的不同。這個不同包括缺少的檔案和修改的內容。
1、補丁的生成
# 比較old和new檔案的不同
[root@localhost ~]# diff 選項 old new
選項:
-a:將任何文件當做文字文件處理。
-b:忽略空格造成的不同。
-B:忽略空白行造成的不同。
-I:忽略大小寫造成的不同。
-N:當比較兩個目錄時,如果某個檔案只在一個目錄中,則在另一個目錄中視作空檔案。
-r:當比較目錄時,遞迴比較子目錄。
-u:使用統一的輸出格式。
常用的選項為-N、-a、-u、-r
。
示例:
# 建立測試目錄
[root@localhost ~]# mkdir test
# 進入測試目錄
[root@localhost ~]# cd test
# 檔案old txt,為了一會輸出便於比較,每行分開
[root@localhost test]# vi old.txt
our
school
# 檔案new.txt
[root@localhost test]# vi new.txt
our
school
in
Beijing
比較下兩個檔案的不同,並生成補丁檔案txt.patch
,命令如下:
# 比較兩個檔案的不同,同時生成txt.patch補丁檔案
[root@localhost test]# diff -Naur /root/test/old.txt /root/test/new.txt > txt.patch
# 注意:
# -Naur是常用選項,是用的時候直接用。
# 兩個檔案一定要使用絕對路徑。
# 最後的檔名不需要絕對路徑。
# 檢視下這個檔案
[root@localhost test]# vi txt.patch
# 前一個檔案,減號代表少內容的檔案
---/root/test/old.txt 2012-11-23 05:51:14.347954373 +0800
# 後一個檔案,加號代表多內容的檔案
+++/root/test/new.txt 2012-11-23 05:50:05.772988210 +0800
# 後一個檔案比前一個檔案多兩行(+表示)
@@ -2,3 + 2,5 @@
our
school
+in
+beijing
2、補丁的打入
# 按照補丁檔案進行更新
[root@localhost test]# patch -pn <補丁檔案
選項:
-pn:n為數字。代表按照補丁檔案中的路徑,指定更新檔案的位置。
可以看到上面打入補丁的命令中,沒有寫需要打補丁的是哪個檔案。因為在補丁檔案中都有記錄,新檔案和舊檔案的位置。
如下圖所示:
-pn
不好理解,我們說明下。
- 補丁檔案是要打入舊檔案的,但是你當前所在的目錄和補丁檔案中的記錄的目錄是不一定匹配的,所以就需要
-pn
來同步兩個目錄的位置。(也就是說補丁檔案中記錄的舊檔案目錄,會追加到當前目錄上。p
幾就是消除補丁檔案中舊檔案目錄的幾級目錄。)- 比如我當前是在
/root/test
目錄中(我要打補丁的舊檔案就在當前目錄下),補丁檔案中記錄的檔案目錄為/root/test/old.txt
,這時如果寫入-p1
(在補丁檔案目錄中取消一級目錄)- 那麼補丁檔案就會打入
/root/test/root/test/old.txt
檔案中,這顯然是不對的。那如果寫入的是-p2
(在補丁檔案目錄中取消二級目錄)那麼補丁檔案打入的就是/root/test/test/o1d.txt
,這顯然也不對。如果寫入的是-p3
(在補丁檔案目錄中取消三級目錄)那麼補丁檔案就是打入的
/root/test/old.txt
,我們的old.txt
檔案就在這個目錄下,所以就應該是-p3
。
那麼我們更新下old.txt
檔案,命令如下:
# 給old.txt檔案打補丁
[root@localhost test]# patch -p3 < txt.patch
patching file old.txt(patch檔案已經打入到old.txt檔案中)
# 檢視下old.txt的內容吧。多出來了in Beiiing兩行
[root@localhost test]# cat old.txt
our
school
in
Beijing