现在的位置: 首页 > 综合 > 正文

Linux小技巧_diff/patch

2013年12月08日 ⁄ 综合 ⁄ 共 1790字 ⁄ 字号 评论关闭

Outline 

- 1.diff
- 2.patch
-
3.例子

-
4.问题

==================================================================================================

目前很少有机会在项目中完全start from scratch,基本以修修补补为主,所以经常会以patch的方式提交结果。


接触linux的一定对patch不陌生,因为kernel中的bug fix都是以patch的方式提交的,用到的就是两个命令diff / patch,下面对它们最常用的使用方法进行介绍,主要参考了:
《Linux下Patch的应用和制作方法介绍》
《用Diff和Patch工具维护源码》

1. diff
直接由两个文件生成patch
  1. diff -Nu old_file new_file > patchForOld.diff
参数说明:
  1. N - 表示将缺少的文件当作空文件处理
  2. u - 表示生成统一格式的patch,也就是说有很多种格式的patch,具体请参见《用Diff和Patch工具维护源码》一文,u是目前最常用的统一格式。

递归比较两个文件夹中的所有文件生成patch
  1. diff -Nur old_dir new_dir > patchForOld.diff
参数说明:
  1. - 表示递归比较两个文件夹下的所有文件

patch文件举例:
  1. diff -uNr prj0/test1 prj1/test1//回显使用的命令
  2. --- prj0/test1 1970-01-01 08:00:00.000000000 +0800//--表示原始文件的路径
  3. +++ prj1/test1 2006-08-18 09:26:00.000000000 +0800//++表示修改后的文件的路径
  4. @@ -1,3 +1,4 @@//以下修改来自源文件的第1行开始的3行
  5. //以及修改后文件第1行开始的4行
  6. +222222//+号表示该行为新增
  7. -111111//-号表示删除
  8.  222222//表示引用,即不变
  9. -111111

2. patch
直接给文件打patch
  1. patch –p0 < patchForOld.diff
  1. patch –RE –p0 < patchForOld.diff
参数说明:
  1. p0 - 表示使用完整的原始文件的路径,即prj0/test1
  2. RE - 反向patch,即还原被打过patch的文件

给文件夹下的多个文件打patch
  1. patch –p1 < patchForOld.diff
  1. patch -R –p1 < patchForOld.diff
参数说明:
  1. p1 - 表示使用第一个“/”以后的原始文件的路径,即test1
  2. R - 反向patch
注意,patch文件可以放在任意位置。

3. 例子
给某个开源的library打patch
  1. diff -Nur ./libxxx ./libxxx_fixed > ~/tmp/myPatch.diff
  2. cd ./libxxx
  3. patch -p1 < ~/tmp/myPatch.diff

4. 问题
加入只想比较两个目录下以.c .h结尾的文件该怎么做?
解决方案1:使用diff的-x选项将不需要的文件全部exclude,但是缺点是可能需要exclude的文件类型有很多。
解决方案2:只比较需要的文件
  1. cd ./libxxx
  2. find . -name '*.[ch]' -exec
    diff -Nu {} ../libxxx_fixed/{}
    \;
最近一直在使用补丁,感觉在Linux系统中补丁的功能真是太强大了,再次感谢Linux,如果您在应用补丁时遇到了错误信息,参考

抱歉!评论已关闭.