使用diff命令打補丁詳解!

2021-06-26 16:09:26 字數 3315 閱讀 2960

使用diff命令打補丁詳解!

分類: linux作業系統

2011-08-09 10:35

9人閱讀

(0)收藏舉報

對於開源原始碼修改過程中的必經階段:對原始碼打補丁,總是不夠精通,搜尋了補丁的原理的詳細過程,如下:

在移植或版本公升級過程中,手動比對(用比對工具)轉換是很費力的事情,特別是發生變化的檔案非常多的情況下,「製作補丁、打補丁」可以簡化這個過程。主要用到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和patch1 diff name diff...

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...