关于更新源码的diff
与patch
命令
-
参考资料:
①《精通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.txt
和file2.txt
,如下所示:
- 假设有两个有差异的文件
-
调用diff命令进行比较,输出风格为统一模式
diff -u file1.txt file2.txt #输出如下所示:
- 前两行为文件名和时间戳组成的开头,第一个文件用
---
做标记,第二个文件用+++
做标记 - 第三行的
@@ -1,4 +1,4 @@
描述了第一个文件的差异存在范围是第1行到第4行,第二个文件的差异存在范围是第1行到第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.txt
到file2.txt
#先键入到同时包含file1.txt和file2.txt的目录下,然后再执行命令 patch < file.patch #我们没有必要再去指定要更新/修补的目标文件,因为diff文件/file.patch文件中已经在标题行包含了文件名
或者如下命令更新:
-p
参数主要用于目录相关的地方,假设有一个补丁文件开头如下所示:情况1:若当前位于
src
目录下,则可直接执行如下命令进行更新:patch -p0 < file.patch 或 patch < file.patch
情况2:若补丁开头与当前环境不同,则可以使用
-p
适当忽略几层目录也即若你当前所在的目录为
package-3.45
,其下有src
目录,针对上图的补丁文件,需要忽略第一层的目录patch -p1 < file.patch #其中file.patch 也可以使用绝对路径定位到该文件
如果是源码更新完之后,就可以重新编译构建、安装了
make clean main #先清理目标文件,然后构建 make install #安装