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不是同一个目录。