如何利用diff和patch更新源码

关于更新源码的diffpatch命令

  • 参考资料:

    ①《精通Linux》p17,p279–p280

    ②《快乐的 Linux 命令行》http://billie66.github.io/TLCL/ p291–p295

    ③《鸟哥的Linux私房菜,基础3版》p366–p368

diff命令

  • 主要用于比较文件或者目录之间的差异,配合patch命令可以实现不同程序源码版本之间的更改。通常情况下的一个用例是diff程序创建一个diff文件patch补丁文件,然后patch使用该文件对源码进行更新

  • diff比较命令有不同的输出风格,这里记录最为常用的统一模式风格,也即使用 -u选项

    • 假设有两个有差异的文件file1.txtfile2.txt,如下所示:

    如何利用diff和patch更新源码

  • 调用diff命令进行比较,输出风格为统一模式

    diff -u file1.txt file2.txt
    #输出如下所示:
    

    如何利用diff和patch更新源码

    1. 前两行为文件名和时间戳组成的开头,第一个文件用---做标记,第二个文件用+++做标记
    2. 第三行的@@ -1,4 +1,4 @@描述了第一个文件的差异存在范围是第1行到第4行,第二个文件的差异存在范围是第1行到第4行,-表示第一个文件,+表示第二个文件
    3. 第三行之后的字符串是文本行本身,以三种字符开头,代表不同的涵义
      • 空格表示两个文件均含有改行;-表示从一个文件更新为第二个文件时需要删除改行;+表示从第一个更新为第二个文件时需要添加改行
    4. 注意:该补丁文件已经包含了所有的更新/修改策略,所以更新的时候只要能找到该文件就可以进行更新
  • 另外:diff可以工作于任何文本文件,源码、配置文件等等

  • 使用diff命令生成区别文件或补丁文件

    diff -Naur old_file new_file > diff_file
    #其中old_file和new_file既可以是文件也可以是目录
    -N 表示如果是比较目录,若文件A仅出现在某目录中,预设显示为Only in.....
    -u 表示使用统一模式输出,也即前文所述的模式
    -r 表示递归比较子目录
    -a 表示逐行比较文本文件
    

    例如:

    diff -Naur file1.txt file2.txt > file.patch
    
  • 接下来就可以利用patch命令和file.patch补丁文件进行更新

  • patch命令

    #更新
    patch -pN < patch_file
    #还原
    patch -R -pN < patch_file
    
    -p 表示忽略N层目录(这个地方有点不好理解,后面会说)
    -R 表示将新的文件还原成旧的版本
    

    接着上文:更新file1.txtfile2.txt

    #先键入到同时包含file1.txt和file2.txt的目录下,然后再执行命令
    patch < file.patch 
    #我们没有必要再去指定要更新/修补的目标文件,因为diff文件/file.patch文件中已经在标题行包含了文件名
    

    或者如下命令更新:

    -p参数主要用于目录相关的地方,假设有一个补丁文件开头如下所示:

    如何利用diff和patch更新源码

    情况1:若当前位于src目录下,则可直接执行如下命令进行更新:

    patch -p0 < file.patch
    或
    patch < file.patch
    

    情况2:若补丁开头与当前环境不同,则可以使用-p适当忽略几层目录

    如何利用diff和patch更新源码

    也即若你当前所在的目录为package-3.45,其下有src目录,针对上图的补丁文件,需要忽略第一层的目录

    patch -p1 < file.patch
    #其中file.patch 也可以使用绝对路径定位到该文件
    

    如果是源码更新完之后,就可以重新编译构建、安装了

    make clean main #先清理目标文件,然后构建
    make install 	#安装
    
上一篇:[5.12更新日志]让高清屏真正高清起来


下一篇:看着腿就软 一对情侣在843米高悬崖边拍照(高清图)