對於開源原始碼修改過程中的必經階段:對原始碼打補丁,總是不夠精通,搜尋了補丁的原理的詳細過程,如下:
在移植或版本公升級過程中,手動比對(用比對工具)轉換是很費力的事情,特別是發生變化的檔案非常多的情況下,「製作補丁、打補丁」可以簡化這個過程。主要用到diff和patch1、diff
name
diff - find differences between two files
synopsis
diff [options] from-file to-file
from_file to_file can be a directory.
簡單的說,diff的功能就是用來比較兩個檔案的不同,然後記錄下來,也就是所謂的diff補丁。
語法格式:diff 【選項】 原始檔(夾) 目的檔案(夾),就是要給原始檔(夾)打個補丁,使之變成目的檔案(夾),術語也就是「公升級」。
下面介紹三個最為常用選項:
-r 是乙個遞迴選項,設定了這個選項,diff會將兩個不同版本源**目錄中的所有對應檔案全部都進行一次比較,包括子目錄檔案。
-n 選項確保補丁檔案將正確地處理已經建立或刪除檔案的情況。
-u 選項以統一格式建立補丁檔案,這種格式比預設格式更緊湊些。
一般 -un 是一直使用的引數,而 -r 如果是含子目錄就使用,不含則不使用。
2、patch
name
synopsis
patch [options] [originalfile[patchfile]]
but usually just
patch -pnum
< patchfile
帶下劃線的代表需要根據實際情況替換。比如 -pnum 實際使用時一般為 -p0, -p1。
簡單的說,patch就是利用diff製作的補丁來實現原始檔(夾)和目的檔案(夾)的轉換。這樣說就意味著你可以由原始檔(夾)――>目的檔案(夾),也可以目的檔案(夾)――>原始檔(夾)。下面介紹幾個最常用選項:
-pnum 是指查詢patch檔案中指定的檔案時,忽略前num個目錄,乙個"/"為一層,詳細內容下面解釋。
-r 選項說明在補丁檔案中的「新」檔案和「舊」檔案現在要調換過來了(實際上就是給新版本打補丁,讓它變成老版本)
-e 選項說明如果發現了空檔案,那麼就刪除它
3、patch檔案的結構
(1)補丁頭
補丁頭是分別由---/+++開頭的兩行,用來表示要打補丁的檔案。---開頭表示舊檔案,+++開頭表示新檔案。
乙個補丁檔案中可能包含以---/+++開頭的很多節,每一節用來打乙個補丁。所以在乙個補丁檔案中可以包含好多個補丁。
--- linux-2.6.25/arch/alpha/boot/misc.c 2010-05-06 01:56:42.565397700 -0700
+++ linux-2.6.29/arch/alpha/boot/misc.c 2010-05-06 00:51:06.000000000 -0700
(2)塊
塊是補丁中要修改的地方。它通常由一部分不用修改的東西開始和結束。他們只是用來表示要修改的位置。他們通常以@@開始,結束於另乙個塊的開始或者乙個新的補丁頭。
塊會縮排一列,這一列是用來表示這一行是要增加還是要刪除的。
+號表示這一行是要加上的。
-號表示這一行是要刪除的。
沒有加號也沒有減號表示這裡只是引用的而不需要修改。
4、-pnum
我們在生成補丁時,多是對目錄進行操作,比如下面我對linux核心25和29兩個版本arch目錄下的檔案做乙個diff操作,生成的差異儲存在arch.patch中:
diff -unr linux-2.6.25/arch linux-2.6.29/arch > arch.patch
可以看到arch.patch開始位置的補丁頭如下:
--- linux-2.6.25_android/arch/alpha/boot/misc.c 2010-05-06 01:56:42.565397700 -0700 (黃色部分為打patch時命令會查詢的檔名)
+++ linux-2.6.29_android/arch/alpha/boot/misc.c 2010-05-06 00:51:06.000000000 -0700
patch -p0 從從當前目錄中查詢
arch/alpha/boot/misc.c,然後進行patch操作。為了能找到檔案,當前目錄應轉到arch所屬的目錄下。
patch -p2 這個功能使用的情景是:打補丁時的目錄結構/目錄名跟現在要打補丁的目錄結構/目錄名不一樣。
比如上面的例子,這個patch很可能是別人打的,打補丁時目錄為 linux-2.6.25/arch,而本地的目錄可能是linux_kernel_2625,
那打補丁時就可以進入linux_kernel_2625,用命令patch -p1
5、常用命令
(1)單個檔案比較
diff –un from-file to-file > to-file.patch //生成補丁 【因為單個檔案,所以不需要-r選項。選項順序沒有關係,即可以是-un,也可以是-nu】
patch –p0 < to-file.patch //打補丁
patch –r –p0 < to-file.patch //去除補丁
(2)目錄比較
diff –unr from-dir to-dir > to-dir.patch //生成補丁
cd from-dir
patch –p1 < to-dir.patch //打補丁
patch –r –p1 < to-dir.patch //去除補丁
6、為核心打補丁
(1)首先是解壓,因為發布的補丁檔案都是使用gzip壓縮的。
$gunzip ../setup-dir/ patch-2.4.21-rmk1.gz
(2)然後進入你的核心源**目錄
$cd linux-2.4.21
(3)打補丁
$patch –p1 < ../../setup-dir/patch-2.4.21-rmk1
打完補丁後,需要檢查一下有沒有拒絕執行的檔案,即檢查.rej檔案的存在。使用命令:
$find -name *.rej
參考文件:
使用diff命令打補丁詳解!
使用diff命令打補丁詳解!分類 linux作業系統 2011 08 09 10 35 9人閱讀 0 收藏舉報 對於開源原始碼修改過程中的必經階段 對原始碼打補丁,總是不夠精通,搜尋了補丁的原理的詳細過程,如下 在移植或版本公升級過程中,手動比對 用比對工具 轉換是很費力的事情,特別是發生變化的檔案...
diff製作補丁和patch打補丁
1 製作補丁 製作補丁使用diff命令 假設原始檔為 wx srcdir bak 目標檔案為 tmp new1 new2 srcdir 目標檔案是在原始檔基礎上的更新,更新之後想產生乙個補丁檔案。所謂補丁檔案,就是記錄下這兩個檔案的 異同。補丁檔案作用 公升級和備份。想做個備份為v1版本。如果把整個...
打補丁 linux中 的Diff和patch
diff和patch是一對工具,從數學上來講,diff是對兩個集合的差運算,patch是兩個集合的和運算。基本命令語法 patch r dry run patch file name p 為path的縮寫。n 指將patc 件中的path第n條 及其左邊部分取消。r 解除安裝patch包。dry r...