zoukankan      html  css  js  c++  java
  • 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不是同一个目录。
  • 相关阅读:
    2018第45周日
    RabbitMQ消息的消费与持久化
    Rabbitmq的调度策略
    Rabbitmq交换器Exchange和消息队列
    RabbitMQ概念
    微服务拆分
    微服务演化
    2018第44周日
    福勒(Martin Fowler)
    微服务架构定义那点事
  • 原文地址:https://www.cnblogs.com/mascotxi/p/4759539.html
Copyright © 2011-2022 走看看