Chinaunix首页 | 论坛 | 博客
  • 博客访问: 263625
  • 博文数量: 94
  • 博客积分: 526
  • 博客等级: 中士
  • 技术积分: 687
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-09 10:02
文章存档

2014年(1)

2013年(10)

2012年(83)

分类:

2012-11-16 22:14:09

原文地址:Linux小技巧_diff/patch 作者:deepsky24

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. r - 表示递归比较两个文件夹下的所有文件

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/{} \;

阅读(426) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~