Outline
==================================================================================================
接触linux的一定对patch不陌生,因为kernel中的bug fix都是以patch的方式提交的,用到的就是两个命令diff / patch,下面对它们最常用的使用方法进行介绍,主要参考了:
《Linux下Patch的应用和制作方法介绍》
《用Diff和Patch工具维护源码》
1. diff
直接由两个文件生成patch
- diff -Nu old_file new_file > patchForOld.diff
参数说明:
- N - 表示将缺少的文件当作空文件处理
- u - 表示生成统一格式的patch,也就是说有很多种格式的patch,具体请参见《用Diff和Patch工具维护源码》一文,u是目前最常用的统一格式。
递归比较两个文件夹中的所有文件生成patch
- diff -Nur old_dir new_dir > patchForOld.diff
参数说明:
- r - 表示递归比较两个文件夹下的所有文件
patch文件举例:
- diff -uNr prj0/test1 prj1/test1//回显使用的命令
- --- prj0/test1 1970-01-01 08:00:00.000000000 +0800//--表示原始文件的路径
- +++ prj1/test1 2006-08-18 09:26:00.000000000 +0800//++表示修改后的文件的路径
- @@ -1,3 +1,4 @@//以下修改来自源文件的第1行开始的3行
- //以及修改后文件第1行开始的4行
- +222222//+号表示该行为新增
- -111111//-号表示删除
- 222222//表示引用,即不变
- -111111
2. patch
直接给文件打patch
- patch –p0 < patchForOld.diff
- patch –RE –p0 < patchForOld.diff
参数说明:
- p0 - 表示使用完整的原始文件的路径,即prj0/test1
- RE - 反向patch,即还原被打过patch的文件
给文件夹下的多个文件打patch
- patch –p1 < patchForOld.diff
- patch -R –p1 < patchForOld.diff
参数说明:
- p1 - 表示使用第一个“/”以后的原始文件的路径,即test1
- R - 反向patch
注意,patch文件可以放在任意位置。
3. 例子
给某个开源的library打patch
- diff -Nur ./libxxx ./libxxx_fixed > ~/tmp/myPatch.diff
- cd ./libxxx
- patch -p1 < ~/tmp/myPatch.diff
4. 问题
加入只想比较两个目录下以.c .h结尾的文件该怎么做?
解决方案1:使用diff的-x选项将不需要的文件全部exclude,但是缺点是可能需要exclude的文件类型有很多。
解决方案2:只比较需要的文件
- cd ./libxxx
- find . -name '*.[ch]' -exec diff -Nu {} ../libxxx_fixed/{} \;
最近一直在使用补丁,感觉在Linux系统中补丁的功能真是太强大了,再次感谢Linux,如果您在应用补丁时遇到了错误信息,参考