返回首页
当前位置: 主页>开发编程语言>

使用diff patch制作补丁

时间:2008-03-30 00:00来源:亚洲互联网 作者:伟大的中国程序员 点击:

   您正在看的C语言教程是:使用diff patch制作补丁。linux的常用命令

diff   diff是生成源码补丁的必备工具。其命令格式为:  diff [命令行选项] 原始文件 新文件 常用命令行选项如下:    -r 递归处理目录     -u 输出统一格式(unified format)    -N patch里包含新文件   -a patch里可以包含二进制文件   它的输出在stdout上,所以你可能需要把它重定向到一个文件。diff的输出有“传统格式”和“统一格式”之分,现在大都使用统一格 式:   传统格式示例:    [hahalee@builder]$ diff a.txt b.txt    1a2    > here we insert a new line    3d3    < why not this third line?   统一格式示例:    [hahalee@builder]$ diff -u a.txt b.txt    --- a.txt Thu Apr 6 15:58:34 2000     b.txt Thu Apr 6 15:57:53 2000    @@ -1,3 1,3 @@    This is line one     here we insert a new line    and this is line two    -why not this third line?   通过比较可以看出,传统格式的patch文件比较小,除了要删除/插入的行外没有冗余信息。统一格式则保存了上下文(缺省是上下各三 行,最少需要两行),这样,patch的时候可以允许行号不精确匹配的情况出现。另外,在patch文件的开头明确地用---和 标示出原始文件 和当前文件,也方便阅读。要选用统一格式,用 u 开关。   通常,我们需要对整个软件包做修改,并生成一个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格式有一定的模糊匹配能力,能减少原软件包升级带来的维护工作量(见后)   patch   patch命令跟diff配合使用,把生成的补丁应用到现有代码上。常用命令行选项:   patch [命令行选项] [待patch的文件[patch]]   -pn patch level(n是数字) -b[后缀] 生成备份,缺省是.orig 为了说明什么是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成功,缺省是不建备份文件的(注:FreeBSD下的patch工具缺省是保存备份),如果你需要,可以加上 b 开关。这样把修改前的 文件以“原文件名.orig”的名字做备份。如果你喜欢其它后缀名,也可以用“b 后缀”来指定。   如果patch失败,patch会把成功的patch行给patch上,同时(无条件)生成备份文件和一个.rej文件。.rej文件里是没有成功提交的patch 行,需要手工patch上去。这种情况在原码升级的时候有可能会发生。   关于二进制文件的说明:binary文件可以原始方式存入patch文件。diff可以生成(加-a选项),patch也可以识别。如果觉得这样的patch文件 太难看,解决方法之一是用uuencode处理该binary文件。




秦华 『上海买保险』上海地区人寿保险资深寿险顾问 上海外籍人士买保险-高端人士医疗办理
服务项目:儿童医疗/子女教育金/养老保险/重大疾病/意外伤害/员工团险/公众责任
免费热线『上海』:13761630213, QQ:107242375, Email:victor.qin@qq.com
选择保险事业 为了爱,为了一份坚定的承诺!MSN:
上海地区请直接拨打本人电话,应约免费上门提供免费保险方案。
Baoxian.ws>>           旅行签证保险、上门办理>>        重大疾病网>>     上海重大疾病一览    
友情链接: 走在上海人寿保险的前端    和讯保险博客    上海投保在线    Shanghai Insurance    秦华的个人简历



顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
图文并茂 我的链接
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
上海高端医疗/住院医疗保险信息
上海保险规划师信息
上海子女教育理财保险信息
上海保险规划师信息
上海女性高端生育保险方案-等待期
上海保险规划师信息
上海三口之家家庭保障方案
上海保险规划师信息
上海女性特色重大疾病保险方案
上海保险规划师信息
上海女性白领理财保险方案
上海保险规划师信息
上海养老理财规划保险方案
上海保险规划师信息
通过网络取得初步咨询
  •    
上海办理-免费咨询送计划书
上海买保险
上海办理-申根签证 出国旅行保险
上海买保险
上海买保险,海外基金,买保险,友邦保险,中国人民健康保险,养老保险,儿童保险,儿童医疗,子女教育金,太平洋保险,医疗保险,工伤保险条例,中国人寿保险,保险公司,中国平安保险,医疗险,进口药,自费药,外籍人士医疗,泰康人寿,英国保诚集团,上海综合保险,国际医疗保险,上海医疗保险,上海社会保险,上海养老保险,上海市综合保险,上海平安保险,上海太平洋保险,和睦家医院,上海综合保险卡,买保险,高端医疗,重大疾病,意外伤害,定期寿险,家庭理财,友邦保险,金茂大厦,少儿互助基金,上海社保,太平洋集团,港安医院