zoukankan      html  css  js  c++  java
  • 使用diff同patch工具

     在给客户提供技术支持工作的时候,常会遇到需要修改各种不同的配置文件。过去的方式,通常是描述修改的地方,然后由用户自行修改,或使用sed等工具写一个脚本给用户运行。但这样会带来一些问题:如果用户不会vi,或者他理解错、找错配置的位置,这样带来的问题可能更难预计。
       此时,或许可以试试我的方法,借用diff和patch直接帮用户修改,然后把生成的“patch补丁”发给他运行即可。这样工作量小,而且也能控制修改后的结果,当然也方便Email发送咯。
    一、介绍
    diff和patch是一对工具,在数学上来说,diff是对两个集合的差运算,patch是对两个集合的和运算。diff比较两个文件或文件集合的差异,并记录下来,生成一个差异文件,这也是我们常说的补丁文件。补丁文件能运用于原来的两个集合之一,从而得到另一个集合。
    举个例子来说文件A和文件B,经过diff之后生成了补丁文件C,那么着个过程相当于 A -B = C ,那么patch的过程就是B+C = A 或A-C =B。
    因此我们只要能得到A, B, C三个文件中的任何两个,就能用diff和patch这对工具生成另外一个文件。
    二、使用
    实例说明是最快的方法,假设现在有a、b两个文件,内容如下:
    引用
    $ cat a
    123456
    $ cat b
    abcdef

    其中a是用户发给我的文件,而b是我修改后的文件。
    那我们可以这样生成c文件:
    $ diff -Naur a b > c

    然后,可以把c文件发给用户,运行如下的命令即可自行修改a->b:
    $ patch -p0 a < c
    patching file a

    结果如下:
    $ cat a
    abcdef

    三、恢复
    上面的操作很简单吧。那如果万一a修改有误,如何恢复呢?通过前面的说明可以知道,通过c文件是可以直接恢复的:
    引用
    $ patch -R -p0 a < c
    patching file a
    $ cat a
    123456

    可以看到使用diff和patch是比较安全的,请注意-R选项哦!
    另外,diff生成的c文件是有记录文件名的,在不指定原文件的情况下,可以自动识别:
    $ patch -p0 < c
    patching file a

    反了会这样:
    $ patch -p0 b < c
    patching file b
    Reversed (or previously applied) patch detected!  Assume -R? [n] n
    Apply anyway? [n] n
    Skipping patch.
    1 out of 1 hunk ignored -- saving rejects to file b.rej

    所以,一般是不会搞错新旧文件的。
    四、路径问题
    很多时候,我们还会遇到一个问题。就是为了防止文件修改错,或需要同时修改多个文件,可能会建立多一层目录,例如:
    引用
    $ ls -R
    .:
    new  old
    ./new:
    b
    ./old:
    a

    diff是可以识别路径:
    $ diff -Naur old/ new/ > c

    补丁需要这样打:

    $ cd old/
    $ patch -p1 < ../c
    patching file a
    patching file b

    结果如下:
    引用
    $ ls
    b
    $ cat b
    abcdef

    ※注意咯,这样会把整个目录的文件内容和文件名都改掉的。另外,如果目录中有多个文件,除了new目录中的空文件外,会把old下的所有文件都换成new的文件和内容;new没有,而old有的文件,会删除。
    引用
    -pN参数的意思是:取消N层目录,也就是把old/改为./

    五、注意事项
    引用
    1、在patch之前不要对原文件进行任何修改,否则补丁可能会失效;
    2、如果做了多个补丁,请注意先后顺序,要按次序打才行;
    3、如果打补丁出现问题,会生成.rej文件,其中包括原文件和补丁差异的地方。
  • 相关阅读:
    什么是SQLCLR与使用
    SQL Server中使用正则表达式
    YUV格式
    Android官方开发文档Training系列课程中文版:手势处理之ViewGroup的事件管理
    Android中利用5.0系统屏幕录制UI漏洞骗取应用录制屏幕授权
    Android解析编译之后的所有文件(so,dex,xml,arsc)格式
    PageRank 算法--从原理到实现
    机器人视觉初级系列
    深入解析 iOS 开源项目
    微信热补丁 Tinker 的实践演进之路
  • 原文地址:https://www.cnblogs.com/leino11121/p/2381885.html
Copyright © 2011-2022 走看看