【diff和patch的使用】+【软件开发常用方法】
diff/patch这对工具在数学上来说,diff是对2个集合求差,patch是求和
diff A B > C 生成A和B的diff文件C
patch A C 给A打上diff文件得到B
patch -R B C B还原为A
diff命令:
语法:diff [选项] file1 file2
例子:diff -uNr linux-2.6.xxx linux-2.6.xxx.1 > diff.patch
最常用的一些参数的含义:
-u –unified //新版上下文格式,即统一格式,相对于传统格式的patch文件要大一些,除了要删除/插入的行外,还保存了上下文(缺省是上下各三行,最少需要两行),这样,patch的时候可以允许行号不精确匹配的情况出现。另外,在patch文件的开头明确地用—和+++标示出原始文件和当前文件,也方便阅读。
-r –recursive 当 file1 和 file2 是目录时,递归比较。
-N 如果某个文件只在一个目录中出现,则假定在另一个目录中为空文件.
-a 补丁中包含二进制文件
其他相关说明:
diff的输出格式有三种:列举方式,命令模式,上下文模式
命令模式有:ed命令模式和RCS(Revision Control System)
上下文模式有:旧版和新版,也有叫做"传统"和"统一"两种格式。
-b 忽略行尾的空格,而字符串中的一个或多个空格符都视为相等。
-p –show-c-function 标识不同之处所在的函数名(只用于C程序)
-e –ed 产生一个合法的 ed 脚本作为输出
patch:
语法:patch [options] [originalfile] [patchfile]
例子:
cp diff.patch linux-2.6.xxx/.
cd linux-2.6.xxx
patch -p1 < diff.patch
参数说明:
如果patchfile为空,则从标准输入读取。
一般使用下面的形式:
patch -p[num] < patchfile
最常见的是,复制patch文件,进入原先打包的根目录下,然后运行:
patch -p1 < patchfile
-p跟着的数字,表示共去掉patch中的几层目录。也就是patch level。
为了说明什么是patch level,这里看一个patch文件的头标记。
diff -ruNa xc.orig/config/cf/Imake.cf xc.bsd/config/cf/Imake.cf
— xc.orig/config/cf/Imake.cf Fri Jul 30 12:45:47 1999
+++ xc.new/config/cf/Imake.cf Fri Jan 21 13:48:44 2000
这个patch如果直接应用,它会去找xc.orig/config/cf目录下的Imake.cf文件,假如你的源码树的根目录是缺省的xc而不是xc.orig,除了mv xc xc.orig之外,有无简单的方法应用此patch呢?patch level就是为此而设:patch会把目标路径名砍去开头patch level个节(由/分开的部分)。在本例中,可以用下述命令:cd xc; patch _p1 < /pathname/xxx.patch 完成操作。注意,由于没有指定patch文件,patch程序默认从stdin读入,所以用了输入重定向。
如果patch失败,patch会把成功的行打上补丁,失败的行存为以.rej为后缀的文件折,并生成原文件的备份,如果成功则不生成备份。 -b选项可以指定后缀名。
【软件开发常用方法】
通常,我们需要对整个软件包做修改,并生成一个patch文件,下面是典型的操作过程。这里就要用到前面介绍的几个命令行开关了:
tar xzvf software.tar.gz # 展开原始软件包,其目录为software
cp _a software software-orig # 做个修改前的备份
cd software
[修改,测试……]
cd ..
diff _ruNa software-orig software > software-my.patch
现在我们就可以保存software-my.patch做为这次修改的结果,至于原始软件包,可以不必保存。等到下次需要再修改的时候,可以用patch命令把这个补丁打进原始包,再继续工作。比如是在linux kernel 上做的工作,就不必每次保存几十兆修改后的源码了。这是好处之一,好处之二是维护方便,由于unified patch格式有一定的模糊匹配能力,能减少原软件包升级带来的维护工作量。
注意,如果是有cvs之类的文件夹或目录的,要排除对应的,再打patch:
patch -Nur program-1.0 program-1.1 –exclude=CVS
注:整理自网络。
转载请注明:在路上 » 【diff和patch的使用】+【软件开发常用方法】