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

使用diff和patch工具

2018年04月07日 ⁄ 综合 ⁄ 共 1271字 ⁄ 字号 评论关闭

使用diffpatch工具

一、介绍
diffpatch是一对工具,在数学上来说,diff是对两个集合的差运算,patch是对两个集合的和运算。diff比较两个文件或文件集合的差 异,并记录下来,生成一个差异文件,这也是我们常说的补丁文件。补丁文件能运用于原来的两个集合之一,从而得到另一个集合。
举个例子来说文件A和文件B,经过diff之后生成了补丁文件C,那么着个过程相当于 A -B = C ,那么patch的过程就是B+C = A A-C =B
因此我们只要能得到A, B, C三个文件中的任何两个,就能用diffpatch这对工具生成另外一个文件。

二、使用
实例说明是最快的方法,假设现在有ab两个文件,内容如下:

a

aaaaaa

bbbbbb

b

aaaaaa

cccccc

其中a是用户发给我的文件,而b是我修改后的文件。
那我们可以这样生成patch文件:

diff -Naur a b > c

然后,可以把c文件发给用户,运行如下的命令即可自行修改a->b

patch -p0 a < c

结果如下:

a

aaaaaa

cccccc

三、恢复
上面的操作很简单吧。那如果万一a修改有误,如何恢复呢?通过前面的说明可以知道,通过c文件是可以直接恢复的:

patch -R -p0 a < c

结果a:

aaaaaa

bbbbbb

可以看到使用diffpatch是比较安全的,请注意-R选项哦!

另外,diff生成的c文件是有记录文件名的,在不指定原文件的情况下,可以自动识别:

patch -p0 < c

四、注意

1、在patch之前不要对原文件进行任何修改,否则补丁可能会失效;
2、如果做了多个补丁,请注意先后顺序,要按次序打才行;
3、如果打补丁出现问题,会生成.rej文件,其中包括原文件和补丁差异的地方。

.参数说明

diff [options] oldfilenewfile
[options]
-r:递归选项,包含子目录文件

-a补丁中包含二进制文件
-u:以统一格式创建补丁文件,标准格式
-N:正确处理新创建或已删除文件的情况

patch [options] [originalfile][patchfile]
[options]
-p0:从当前目录查找目标文件(夹)
-p1:忽略第一次目录,从当前目录开始查找
-E:若发现空文件,则删除
-R:在补丁文件中的“新”文件和“旧”文件调换过来。

在这里以实例说明:

--- old/modules/pcitable Mon Sep 27 11:03:56 1999

+++ new/modules/pcitable Tue Dec 19 20:05:41 2000

如果使用参数-p0,那就表示从当前目录找一个叫做old的文件夹,在它下面寻找modules下的pcitable文件来执行patch操作。

如果使用参数-p1,那就表示忽略第一层目录(即不管old),从当前目录寻找modules的文件夹,在它下面找pcitable。这样的前提是当前目录必须为modules所在的目录。而diff补丁文件则可以在任意位置,只要指明了diff补丁文件的路径就可以了。当然,可以用相对路径,也可以用绝对路径。不过我一般习惯用相对路径。

抱歉!评论已关闭.