最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【diff和patch的使用】+【软件开发常用方法】

工作和技术 crifan 2187浏览 0评论

【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的使用】+【软件开发常用方法】

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
79 queries in 0.170 seconds, using 22.15MB memory