『學了就忘』Linux軟體包管理 — 48、給原始碼包打補丁

繁華似錦Fighting發表於2021-11-18

在以前的軟體原始碼包,需要打補丁的時候比較多。現在的原始碼包很少進行打補丁了,因為根據需求安裝不同的版本即可,比較商業化了。(也就是知道如何給原始碼包打補丁就可以了,瞭解即可。)

從開發者的角度,補丁就是軟體新版本和現有版本的不同。這個不同包括缺少的檔案和修改的內容。

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為數字。代表按照補丁檔案中的路徑,指定更新檔案的位置。

可以看到上面打入補丁的命令中,沒有寫需要打補丁的是哪個檔案。因為在補丁檔案中都有記錄,新檔案和舊檔案的位置。

如下圖所示:

image

-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

相關文章