patch命令和diff命令是linux打補丁的成對命令,diff 負責生產xxxxx.patch文件,patch命令負責將補丁打到要修改的源碼上。但是patch命令的參數-p很容易使人迷惑,因為對-p 后面的數字理解不清晰,造成patch打不上,項目時間拖延,很是郁悶。后來仔細實踐了一下,弄清楚了-p實際的含義。
舉例說明更加容易看懂。比如有一個patch文件,名為drvAUDIO_if.patch,在/home/brinus/testdir/目錄下。需要打補丁的源文件路徑為/home/brinus/testdir/develop/.../drvAUDIO_if.h,develop為源碼根目錄,drvAUDIO_if.h為需要打patch的源碼。那么patch命令的-p值取什么並不取決於源碼根目錄develop之前有多少級目錄,而取決於從源碼根目錄develop到需要打patch的drvAUDIO_if.h的目錄級數和patch文件中的路徑級數的差值。也就是說,源碼放在什么地方都無所謂,有所謂的是差值。
patch文件內容:
diff -U 10 -Naur output/619977/previousVersion///develop/include/Kangaroo/k3/drvAUDIO_if.h output/619977/currentVersion///develop/include/Kangaroo/k3/drvAUDIO_if.h --- output/619977/previousVersion///develop/include/Kangaroo/k3/drvAUDIO_if.h 2013-08-30 19:09:00.970605620 +0800
+++ output/619977/currentVersion///develop/include/Kangaroo/k3/drvAUDIO_if.h 2013-08-30 19:09:01.394607088 +0800
@@ -2817,44 +2817,48 @@
patch文件首有需要打patch的源碼的的路徑: output/619977/previousVersion///develop/include/Kangaroo/k3/drvAUDIO_if.h 源碼根目錄從develop到需要打patch文件的路徑: develop/include/Kangaroo/k3/drvAUDIO_if.h 如果當前目錄在/home/brinus/testdir/,即與源碼根目錄在同級目錄下,patch命令應該為:
解釋:testdir目錄下有develop源碼根目錄,3的含義是去除patch文件首的指示路徑“output/619977/previousVersion///develop/include/Kangaroo/k3/drvAUDIO_if.h”中的“output/619977/previousVersion/”,剩下的部分“develop/include/Kangaroo/k3/drvAUDIO_if.h” 與源碼的路徑完全一致,這樣patch文件就可以根據具體行號及增(+)刪(-)符號對源文件進行打patch。(注:“output/619977/previousVersion///”與“output/619977/previousVersion/”一樣) 即: output/619977/previousVersion///develop/include/Kangaroo/k3/drvAUDIO_if.h
如果當前目錄在/home/brinus/testdir/develop,patch命令應該為:
打patch成功會顯示: patching file include/Kangaroo/k3/drvAUDIO_if.h Hunk #1 succeeded at 2156 (offset 12 lines). 打patch失敗會顯示: patching file develop/include/Kangaroo/k3/drvAUDIO_if.h Hunk #1 FAILED at 2144. 1 out of 1 hunk FAILED -- saving rejects to file develop/include/Kangaroo/k3/drvAUDIO_if.h.rej 如果當前目錄是develop的話,那么這個路徑是在當前目錄下新建路徑develop/include/Kangaroo/k3/drvAUDIO_if.h.rej,兩個develop不是同一個目錄。