diff && patch 命令製作補丁
diff 命令
diff
可以比較兩個檔案,並可同時記錄下二者的區別。製作補丁時的一般用法和常見選項為:
diff 【選項】 原始檔(夾) 目的檔案(夾)
-r:遞迴,設定後diff
會將兩個不同版本原始碼目錄中的所有對應檔案都進行一次比較,包括子目錄檔案;
-N:確保補丁檔案將正確地處理已經建立或刪除檔案的情況;
-u:一體化diff
輸出(參見例1)
-E, -b, -w, -B, –strip-trailing-cr
忽略各種空白,可參見文件,按需選用。
例1,有如下兩個差異檔案:
# version1.txt
this is the original text
line2
line3
line4
happy hacking!
#version2.txt
this is the original text
line2
line4
happy hacking!
GNU is not UNIX
非一體化diff
輸出:
一體化diff
輸出(加-u
引數):
將上面的差異輸出重定向到一個檔案中,
diff -u version1.txt version2.txt > version.patch
這個檔案就是補丁檔案,可以用patch命令將修改應用與任意檔案。
patch 命令
patch
的作用則是將diff
記錄的結果(即補丁)應用到相應檔案(夾)上。最常見的用法為:
patch -pNUM <補丁檔案
-p Num:忽略幾層資料夾,隨後詳解;
-E:說明如果發現了空檔案,那麼就刪除它;
-R:取消打過的補丁。
為了解釋 -p 引數,需要看看如下patch檔案片段:
--- old/modules/pcitable Mon Sep 27 11:03:56 1999
+++ new/modules/pcitable Tue Dec 19 20:05:41 2000
如果使用引數
-p0
,那就表示忽略當前old資料夾開始執行patch
操作;如果使用引數
-p1
,表示忽略第一層目錄(即不管old),從 modules 資料夾開始進行patch
操作。
應用
利用以上命令,處理單個檔案補丁的方法:
# 產生補丁
diff -uN file1 file2 >file.patch
# 打補丁
patch -p0 < file.patch
# 取消補丁
patch -RE -p0 < file.patch
對整個資料夾打補丁的情況:
# 產生補丁
diff -uNr dir1 dir2 >dir.patch
# 打補丁
cd dir2
patch -p1 < dir.patch
# 取消補丁
patch -R -p1 <dir.patch
patch 檔案構成
補丁檔案裡到底儲存了哪些資訊呢?看看這個例子:
--- test0 2006-08-18 09:12:01.000000000 +0800
+++ test1 2006-08-18 09:13:09.000000000 +0800
@@ -1,3 +1,4 @@
+222222
111111
-111111
+222222
111111
補丁頭
補丁頭是分別由—/+++開頭的兩行,用來表示要打補丁的檔案。—開頭表示舊檔案,+++開頭表示新檔案。
一個補丁檔案中的多個補丁
一個補丁檔案中可能包含以—/+++開頭的很多節,每一節用來打一個補丁。所以在一個補丁檔案中可以包含好多個補丁。
塊
塊是補丁中要修改的地方。它通常由一部分不用修改的東西開始和結束。他們只是用來表示要修改的位置。他們通常以@@
開始,結束於另一個塊的開始或者一個新的補丁頭。
塊的縮排
塊會縮排一列,而這一列是用來表示這一行是要增加還是要刪除的。
塊的第一列
+號表示這一行是要加上的。-號表示這一行是要刪除的。沒有加號也沒有減號表示這裡只是引用的而不需要修改。