Linux中patch檔案的產生與使用

MultiMedia之旅發表於2013-08-01

首先介紹一下diff和patch。在這裡不會把man線上文件上所有的選項都介紹一下,那樣也沒有必要。在99%的時間裡,我們只會用到幾個選項。所以必須學會這幾個選項。

1、diff 命令

--------------------

NAME

     diff - find differences between two files

SYNOPSIS

     diff [options] from-file to-file

--------------------

簡單的說,diff的功能就是用來比較兩個檔案的不同,然後記錄下來,也就是所謂的diff補丁。語法格式:diff 【選項】 原始檔(夾)目的檔案(夾),就是要給原始檔(夾)打個補丁,使之變成目的檔案(夾),術語也就是“升級”。

下面介紹三個最為常用選項:

-r 是一個遞迴選項,設定了這個選項,diff會將兩個不同版本原始碼目錄中的所有對應檔案全部都進行一次比較,包括子目錄檔案。

-N 選項確保補丁檔案將正確地處理已經建立或刪除檔案的情況。

-u 選項以統一格式建立補丁檔案,這種格式比預設格式更緊湊些。

簡單的示例:

$ diff -uN File0.cpp File1.cpp > diff.patch

diff.patch就是生成的patch檔案。後面會簡單的介紹一下patch檔案的結構。

2、patch 命令

------------------

NAME

  patch - apply a diff file to an original

SYNOPSIS

  patch [options] [originalfile [patchfile]]

  but usually just

  patch -pnum <patchfile>

------------------

簡單的說,patch就是利用diff製作的補丁來實現原始檔(夾)和目的檔案(夾)的轉換。這樣說就意味著你可以由原始檔(夾)――>目的檔案(夾),也可以由目的檔案(夾)――>原始檔(夾)。

下面介紹幾個最常用選項:

-p0 選項要從當前目錄查詢目的檔案(夾)

-p1 選項要忽略掉第一層目錄,從當前目錄開始查詢。

  ************************************************************

  在這裡以例項說明:

  ---old/modules/pcitable       Mon Sep 27 11:03:561999

  +++new/modules/pcitable       Tue Dec 19 20:05:412000

  如果使用引數-p0,那就表示從當前目錄找一個叫做old的資料夾,在它下面尋找modules下的pcitable檔案來執行patch操作。

  如果使用引數-p1,那就表示忽略第一層目錄(即不管old),從當前目錄尋找modules的資料夾,在它下面找pcitable。這樣的前提是當前目錄必須為modules所在的目錄。而diff補丁檔案則可以在任意位置,只要指明瞭diff補丁檔案的路徑就可以了。當然,可以用相對路徑,也可以用絕對路徑。不過我一般習慣用相對路徑。

  ************************************************************

-E  選項說明如果發現了空檔案,那麼就刪除它

-R  選項說明在補丁檔案中的“新”檔案和“舊”檔案現在要調換過來了(實際上就是給新版本打補丁,讓它變成老版本)

簡單的示例:

方式一:$patch File0.cpp diff.patch

方式二:$patch -p0 < diff.patch

通過下面的命令,可以去除補丁,恢復舊版本

$ patch -RE -p0 < diff.patch

3、patch檔案的結構

(1)補丁頭:

補丁頭是分別由---/+++開頭的兩行,用來表示要打補丁的檔案。---開頭表示舊檔案,+++開頭表示新檔案。

(2)塊:

塊是補丁中要修改的地方。它通常由一部分不用修改的東西開始和結束。他們只是用來表示要修改的位置。他們通常以@@開始,結束於另一個塊的開始或者一個新的補丁頭。

塊的縮排:塊會縮排一列,而這一列是用來表示這一行是要增加還是要刪除的。

塊的第一列:

+號表示這一行是要加上的。

-號表示這一行是要刪除的。

沒有加號也沒有減號表示這裡只是引用的而不需要修改。

--- File0.cpp	2013-08-01 13:40:35.579447633 +0800
+++ File1.cpp	2013-08-01 13:41:04.609447640 +0800
@@ -1 +1 @@
-The First file.
+The Second File.

相關文章