Linux系统补丁工具patch AND diff
一、工具概述:
diff制作补丁的工具
diff后面可以接两个文件名或两个目录名生成补丁
patch打补丁的工具
Patch用途:根据原文件和补丁文件生成目标文件
在数学上来说,diff类似于对两个集合的差运算,patch类似于对两个集合的和运算。diff比较两个文件或文件集合的差异,并记录下来,生成一个diff文件,这也是我们常说的patch文件,即补丁文件。 patch能将diff文件运用于原来的两个集合之一,从而得到另一个集合。
举个例子来说文件A和文件B,经过diff之后生成了补丁文件C,那么这个过程相当于 |A –B| = C ,那么patch的过程就是B + C = A 或A - C = B(A + C = B或者B – C = A)。因此我们只要能得到A, B, C三个文件中的任何两个,就能用diff和patch这对工具生成另外一个文件。这就是diff和patch的妙处。
补丁Patch是天才程序员、Perl的发明者Larry Wall发明的,它应高效地交流程序源代码之需求而生,随着以Linux为代表的开发源代码运行的蓬勃发展,patch这个概念已经成为开放源代码发起者、贡献者和参与者的集体无意识的一部分。patch只包含了对源代码修改的部分,这对于开放源代码社区的协同开发模式具有重要意义,意味的软件新版本的发布和对软件的缺陷或改进可以以更小的文件发布,可以减少网络的传输量,方便软件维护者的管理工作。
patch文件有多种格式,不同平台上所支持的格式不尽相同,但最常见的是context格式和unified格式。context格式被广泛使用,是 patch文件格式事实上的标准。该格式包含了差异部分及其邻近的若干行,邻近就是所谓的上下文,这些行虽然没有变化,但它们出现在patch文件使得还原patch的程序具备更强的容错性。unified格式常见于GNU的patch实现,以patch形式发布的linux内核就使用了该格式。
此外,还有其它比较少用的格式,如Normal格式,并排对比模式(side-by-side),ed script和RCS script模式
等。除了并排对比模式方便用户观察文件差异,其它格式大多数是为了兼容旧的patch格式。
二、工具的用法
1、 diff的用法
diff后面可以接两个文件名或两个目录名生成补丁,例如:
diff [option] oldfile newfile
如果是一个目录名加一个文件名,那么只作用在那么个目录下的同名文件。例如:
diff /usr/xu mine
把目录/usr/xu 中名为mine的文件与当前目录中的mine文件进行比较。
Diff常用的option选项有:
l -r 比较目录时,进行递归比较,用于产生整个代码树的patch
l -u 输出统一格式,diff有"传统"和"统一"两种格式,现在一般使用"统一"格式,比较而言,统一格式生成的文件大,但包含了更多的信息,有利于阅读与定位
l -N 表示如果文件不存在则将其等价为空文件,这个用于产生有文件增加或删除的patch
l -a 补丁中包含二进制文件缺省时,diff向标准输出打印,所以一般都重定向到文件并以patch为后缀,也就是所谓的补丁文件。关于二进制文件的说明:binary文件可以原始方式存入patch文件。diff可以生成(加-a选项),patch也可以识别。如果觉得这样的patch文件太难看,解决方法之一是用uuencode处理该binary文件。
如果是两个目录的话,作用于该目录下的所有文件,不递归。如果我们希望递归执行,需要使用-r参数。不加任何参数生成的diff文件格式是一种简单的格式,这种格式只标出了不一样的行数和内容。我们需要一种更详细的格式,可以标识出不同之处的上下文环境,这样更有利于提高patch命令的识别能力。这个时候可以用-c开关。可以参考表1 diff的命令行选项和参数。
diff的命令行选项和参数:
-a 将所有的文件看作文本,既使文件看起来像是二进制的也不例外,并且进行逐行比较【二进制文件必须加上这个参数】
-b 忽略块中空白数目的改变
-B 忽略插入或删除空行造成的改变
-c 产生"上下文"(context)格式的输出
-C[num] 产生"上下文"(context)格式的输出,显示块前后num行的内容,如果不指定num的值,则显示块前后3行的内容
-H 修改diff处理大文件的方式
-i 忽略大小写
-I regexp 忽略插入或删除与正则表达式regexp匹配的行
-l 将输出结果通过pr命令处理加上页码
-p 显示出现块的C函数
-q 只报告文件是否不同;不输出差别
-r 比较目录时,进行递归比较,用于产生整个代码树的patch
-s 报告两个文件相同(默认的行为是不报告相同的文件)
-t 输出时tab扩展为空白
-u 产生"统一"(unified)格式的输出
-U[num] 产生"统一"(unified)格式的输出,显示块前后num行的内容,如果不指定num的值,则显示块前后3行的内容
-v 打印diff的版本号
-w 逐行比较时忽略空白
-W cols 如果产生并排格式的输出(参见-y),让输出的每一列有cols个字符宽
-x pattern 当比较目录时,忽略匹配模式pattern的任何文件和子目录
-y 产生并排格式的输出
-N 表示如果文件不存在则将其等价为空文件,这个用于产生有文件增加或删除的patch