linux diff命令詳解 和 patch命令


請參考鏈接:https://www.cnblogs.com/wangqiguo/p/5793448.html

diff命令單中模式

1. normal模式

diff file1.txt file2.txt

 

 

 

2. context模式

diff file1.txt file2.txt -c

 

 

 

3. Unified模式

diff file1.txt file2.txt -u

 

 

基本命令語法:

patch [-R] {-p(n)} [--dry-run] < patch_file_name

p:為path的縮寫。

n:指將patch文件中的path第n條’/’及其左邊部分取消。

-R:卸載patch包。

--dry-run:嘗試patch軟件,並不真正修改軟件。

通過diff工具生成補丁, patch工具打上補丁.

在使用diff之前, 你需要保留一份未修改過的源碼, 然后在其它地方修改源碼的一份拷貝. diff對比這兩份源碼生成patch. 修改過的源碼必須保留原來的文件名, 例如, 如果你修改源碼中的a.c文件, 那么, 修改后的文件還是名為a.c, 在修改之前你可以復制a.c為a.orig.c進行備份.

1.為單個文件生成補丁

1 $ diff -up linux-2.6.28.8/net/sunrpc/svc.orig.c linux-2.6.28.8/net/sunrpc/svc.c > patch
這條命令會產生類似如下的輸出, 你將它重定向到一個文件中, 這個文件就是patch.
1 diff -up linux-2.6.28.8/net/sunrpc/svc.orig.c 2009-03-17 08:50:04.000000000 +0800
2 +++ linux-2.6.28.8/net/sunrpc/svc.c 2009-03-30 19:18:41.859375000 +0800
3 @@ -1050,11 +1050,11 @@ svc_process(struct svc_rqst *rqstp)
參數詳解:
-u 顯示有差異行的前后幾行(上下文), 默認是前后各3行, 這樣, patch中帶有更多的信息.
-p 顯示代碼所在的c函數的信息.

2.為多個文件生成補丁

1 $ diff -uprN linux-2.6.28.8.orig/net/sunrpc/ linux-2.6.28.8/net/sunrpc/ > patch
這條命令對比了linux-2.6.28.8.orig/net/sunrpc/和linux-2.6.28.8/net/sunrpc/兩個目錄下的所有源碼差異.
參數詳解:
-r 遞歸地對比一個目錄和它的所有子目錄(即整個目錄樹).
-N 如果某個文件缺少了, 就當作是空文件來對比. 如果不使用本選項, 當diff發現舊代碼或者新代碼缺少文件時, 只簡單的提示缺少文件. 如果使用本選項, 會將新添加的文件全新打印出來作為新增的部分.

3.打補丁

生成的補丁中, 路徑信息包含了你的Linux源碼根目錄的名稱, 但其他人的源碼根目錄可能是其它名字, 所以, 打補丁時, 要進入你的Linux源碼根目錄, 並且告訴patch工具, 請忽略補丁中的路徑的第一級目錄(參數-p1).
1 $ patch -p1 < patch1.diff
diff命令必須在整個Linux源碼的根目錄的上一級目錄中執行.

4. 示例

給修改過的內核生成patch,然后用生成的patch給未修改過的內核打補丁
其中,目錄linux-2.6.31.3為未修改過的內核,目錄linux-2.6.31.3_1為修改過的內核
1 $ diff -uparN linux-2.6.31.3 linux-2.6.31.3_1/ > mypatch
2 $ cd linux-2.6.31.3
3 $ patch -p1 < mypatch

 

注意點

1. 打patch時,參數-p1, 是1而不是l. 為什么忽略第一級目錄,因為工程的下面樹狀結構相同,但是工程名未必相同,所以打patch時候可以通過p1來避免這個問題。這個可以通過查看patch內容來決定具體執行patch的路徑。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM