最近遇到了git format-patch和git am不能正常工作的情況 用git format-patch打的patch無法用git am直接打,每次都有conflict,原因一直沒有找到,只好找其他方法,在這個過程中,發現可以用diff命令生成patch,用patch命令打patch.
1.為單個文件生成補丁
1 $ diff -up linux-2.6.28.8/net/sunrpc/svc.orig.c linux-2.6.28.8/net/sunrpc/svc.c > 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
參數詳解:
-r 遞歸地對比一個目錄和它的所有子目錄(即整個目錄樹).
-N 如果某個文件缺少了, 就當作是空文件來對比. 如果不使用本選項, 當diff發現舊代碼或者新代碼缺少文件時, 只簡單的提示缺少文件. 如果使用本選項, 會將新添加的文件全新打印出來作為新增的部分.
3.打補丁
生成的補丁中, 路徑信息包含了diff生成patch時目錄的名稱, 但其他人目錄可能是其它名字, 所以, 打補丁時, 要進入要打的代碼目錄, 並且告訴patch工具, 請忽略補丁中的路徑的第一級目錄(參數-p1).
1 $ patch -p1 < patch1.diff
4. 示例
給修改過的內核生成patch,然后用生成的patch給未修改過的內核打補丁
其中,目錄linux-2.6.31.3為未修改過的內核,目錄linux-2.6.31.3_1為修改過的內核
1 $ diff -uprN 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的路徑。
2. 參數-p1的1代表忽略1級目錄,如果參數為-p2就忽略2級目錄,以此類推。拿4中的示例為例,diff -upRn后面是直接跟的兩個發生修改的目錄文件件,所以打patch時參數為-p1就可以。如果目錄文件夾前面有2個相同的path,那么參數就需要改為-p3了
參考鏈接:Linux下生成patch和打patch https://www.cnblogs.com/aaronLinux/p/5860552.html