diff製作補丁和patch打補丁

2021-06-27 16:20:32 字數 2194 閱讀 3797

1 製作補丁

製作補丁使用diff命令

假設原始檔為/wx/srcdir_bak

目標檔案為/tmp/new1/new2/srcdir

目標檔案是在原始檔基礎上的更新,更新之後想產生乙個補丁檔案。所謂補丁檔案,就是記錄下這兩個檔案的

異同。補丁檔案作用:公升級和備份。

想做個備份為v1版本。如果把整個核心目錄完全複製乙份,那檔案太大,非常不方便,這時就可以產生乙個

補丁檔案作為備份。只需要幾k位元組,就可以把上百兆的檔案備份了。同樣,乙個上g的檔案需要公升級,只

需要乙個很小的補丁檔案就可以了。

下面來產生這個補丁檔案,使用命令:

diff -urn /wx/srcdir_bak  /tmp/new1/new2/srcdir > /wx/v1.patch

解析:diff就是difference的縮寫,比較兩個檔案異同。

-u 兩個目錄中可能有多個檔案,使這些所有的檔案的補丁合併到一起

-r 目錄中如果有子目錄,子目錄也要產生補丁

-n 如果其中乙個目錄有乙個檔案,而另乙個目錄下沒有,則讓這個檔案與乙個空檔案比較,產生補丁

檔案順序:前面是原始檔srcdir_bak,後邊是目標檔案srcdir,兩個都是目錄檔案,兩個檔案當然也可以同名

使用這個命令之後,在v1.patch中就記錄下了原始檔如果要變成目標檔案,需要做哪些改變。

假設從核心**下到核心版本linux3.1.0原始檔,複製乙份開發之後為linux3.1.0_new,開發完某乙個功能,

做個備份

diff -urn /wx/linux3.1.0 /wx/linux3.1.0_new > /wx/v1.patch

好了,備份做好了,繼續開發之後又出了問題,需要還原到v1版本,那好用patch對linux3.1.0打個補丁吧。

patch -d /wx/linux3.1.0  -p1 < /wx/v1.patch

的內容,就知道上面這個命令的意思了。

2 打補丁

先看一下v1.pacth檔案內容

--- /wx/srcdir_bak/src     

+++ /tmp/new1/new2/srcdir/src

-old

+new

假設根目錄下有乙個/srcdir檔案,srcdir_bak是srcdir的備份。用補丁更新/srcdir的命令:

cd /wx/srcdir 

進入srcdir目錄

patch -p3 < /wx/v1.patch

wx/v1.patch是補丁檔案

引數就乙個-p3

-p是剝離幾層路徑名稱,n=3就是剝離3層路徑,這個n要看v1.patch檔案,

---   /wx/srcdir_bak/src

+++ /tmp/new1/new2/srcdir/src 

大多數情況下這兩個路徑都是有相同的路徑長度,我這裡故意弄成不同的長度,那以哪個路徑長度為準呢?

經過試驗發現,以路徑短的為準,那這裡就是 /wx/srcdir_bak/src這個路徑。即如果patch檔案變為

+++ /wx/srcdir_bak/src

--- /tmp/new1/new2/srcdir/src 

還是分析/wx/srcdir_bak/src這個路徑。

檔案為src,需要剝離的路徑是/wx/srcdir_bak/,最前面的/是第一層,wx/是第二層,srcdir_bak/是第三層,

所以n=3

這裡有一點要注意:/tmp/new1/new2/srcdir的srcdir檔名和你要更新的檔名是可以不同的,名字你可以

任意更改。比如乙個安裝檔案,你可能把安裝路徑和檔名都更改了,這是很常見的。

當然也可以使用命令:

patch -d /srcdir -p3 < /wx/v1.patch

-d 是指定工作目錄,這樣就不需要cd /wx/srcdir 到工作目錄下了

想要掌握這兩個命令,還是要親自做個試驗,建乙個資料夾,新的檔案可以很簡單,就像我的原始檔內容

為old,目標檔案內容問new。

試驗的時候還有乙個重要的技巧,恢復更新的檔案為原來的樣子:

patch -d /srcdir -r -p3 < /wx/v1.patch

-r reverse 反轉,更新之後還可以再恢復到原來的樣子

快去體驗吧。

diff和patch給原始碼做補丁

如果想要對兩個目錄下的所有檔案做diff,可以使用以下命令 diff burn org src dir target src dir patch file 其中 b可以忽略所有的空白行,r對所有的子目錄進行遞迴的操作。org src dir 是未經修改前的源檔案目錄,target src dir 是...

diff和patch給原始碼做補丁

如果想要對兩個目錄下的所有檔案做diff,可以使用以下命令 diff burn org src dir target src dir patch file 其中 b可以忽略所有的空白行,r對所有的子目錄進行遞迴的操作。org src dir 是未經修改前的源檔案目錄,target src dir 是...

打補丁 linux中 的Diff和patch

diff和patch是一對工具,從數學上來講,diff是對兩個集合的差運算,patch是兩個集合的和運算。基本命令語法 patch r dry run patch file name p 為path的縮寫。n 指將patc 件中的path第n條 及其左邊部分取消。r 解除安裝patch包。dry r...