linux中patch命令 -p 選項


 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命令應該為:
    #cd  /home/brinus/testdir/ #patch -p3 < /home/brinus/testdir/drvAUDIO_if.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                                
develop/include/Kangaroo/k3/drvAUDIO_if.h
如果當前目錄在/home/brinus/testdir/develop,patch命令應該為:
#cd  /home/brinus/testdir/develop/
#patch -p4 < /home/brinus/testdir/drvAUDIO_if.patch
 
即去除當前目錄develop在patch文件首的指示路徑中的develop之前的路徑個數
所以,-p后的數值與2個路徑有關:1. 當前所在路徑;2. patch文件首的打patch的源文件指示路徑。
與patch文件所在路徑無關。 找到當前路徑下的源碼根目錄,再與patch文件首打patch的源碼目錄進行比對,該目錄名之前的目錄個數就是-p后面的數值
打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不是同一個目錄。


免責聲明!

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



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