[转] 用Diff和Patch工具维护源码

在Unix系统下,维护源码版本可以使用很多方法,其中最常用的当然是大名鼎鼎的CVS,但实际上,简单的版本维护工作并没有必要使用复杂的CVS等专门的版本维护工具,Unix标配中的diff和patch工具就完全可以完成代码的简单备份和升级工作。

diff以"行"为单位比较两个文本文件(也可以是目录比较),并将不同之处以某种格式输出到标准输出上;patch可以读入这种输出,并按照一定指令使源文件(目录)按照目标文件(目录)更新。Linux内核源码就是按照这种方式保持更新的,我们在www.kernel.org上可以下载到最新内核的patch文件的bzip2包。本文以gnudiffutils 2.7和patch 2.5为例介绍diff和patch工具的使用。

1.diff

diff既可以用来比较两个文件,也可以用来比较两个目录中每个文件。使用-r(--recursive)参数时还可以在目录中嵌套比较。比较目录时除比较同名文件外,对不同名的文件当成新文件处理。对于比较C程序文件,diff还提供了专门的参数(-p,--show-c- function)来标识不同之处所在的函数名。

diff的输出格式有三种:列举方式、命令模式和上下文模式,其中命令模式有分为两种:ed命令格式和RCS(Revision Control System,版本控制系统)命令格式,上下文模式也按格式分为老版和新版两种。看下面的例子就能基本清楚各个格式的区别:

alt

命令格式记录的是从test1更新到test2所需要执行的命令,而上下文模式通常可读性更好一些,它所记录的主要是二者的差异,通常还记录所需修改部分的上下几行(可配置)内容以供比较。见下面的例子:

alt

新版格式较之老版要紧凑一些,Linux内核源码的升级就是按照新版上下文格式用diff组织的,比如patch-2.4.16中所用的具体命令为:

diff -Nur linux-2.4.15 linux

参数N表示如果某个文件仅在一个目录中出现,则假定其在另一个目录中为空文件;u表示unified格式,r表示在目录中嵌套使用,linux-2.4.15显然是老核的目录名,而linux则为新核的目录名。


回页首

2.patch

尽管并没有指定patch和diff的关系,但通常patch都使用diff的结果来完成打补丁的工作,这和patch本身支持多种 diff输出文件格式有很大关系。patch通过读入patch命令文件(可以从标准输入),对目标文件进行修改。通常先用diff命令比较新老版本,patch命令文件则采用diff的输出文件,从而保持原版本与新版本一致。

patch的标准格式为

patch [options] [originalfile] [patchfile]

如果patchfile为空则从标准输入读取patchfile内容;如果originalfile也为空,则从 patchfile(肯定来自标准输入)中读取需要打补丁的文件名。因此,如果需要修改的是目录,一般都必须在patchfile中记录目录下的各个文件名。绝大多数情况下,patch都用以下这种简单的方式使用:

patch -p[num] <patchfile

patch命令可以忽略文件中的冗余信息,从中取出diff的格式以及所需要patch的文件名,文件名按照diff参数中的"源文件"、"目标文件"以及冗余信息中的"Index:"行中所指定的文件的顺序来决定。也就是说,对于如下diff结果文件(Linux内核源码 2.4.16升级包,部分):

 
diff -Nur linux-2.4.15/Makefile linux/Makefile
--- linux-2.4.15/Makefile Thu Nov 22 17:22:58 2001
+++ linux/Makefile Sat Nov 24 16:21:53 2001
@@ -1,7 +1,7 @@
VERSION = 2
PATCHLEVEL = 4
-SUBLEVEL = 15
-EXTRAVERSION =-greased-turkey
+SUBLEVEL = 16
+EXTRAVERSION =
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
……

patch首先尝试当前目录(或者-d参数指定的目录)下的linux-2.4.15/Makefile文件是否存在,如果不存在则试图对linux/Makefile文件操作,仅当两者都不存在时(或者设置了POSIXLY_CORRECT环境变量)才会读取Index:的内容(此文件中没有标识)。

前面提到的-p参数决定了是否使用读出的源文件名的前缀目录信息,不提供-p参数,则忽略所有目录信息,-p0(或者-p 0)表示使用全部的路径信息,-p1将忽略第一个"/"以前的目录,依此类推。如/usr/src/linux-2.4.15/Makefile这样的文件名,在提供-p3参数时将使用linux-2.4.15/Makefile作为所要patch的文件。

对于刚才举的Linux内核源码2.4.16升级包的例子,假定源码目录位于/usr/src/linux中,则在当前目录为/usr /src时使用"patch -p0 <patch-2.4.16"可以工作,在当前目录为/usr/src/linux时,"patch -p1<patch-2.4.16"也可以正常工作。

patch可以直接操作上下文格式以及混合ed格式的diff输出文件,而将ed格式文件通过管道提交给ed程序操作(暂时不知RCS格式的文件如何处理)。


回页首

3.配合使用diff和patch升级源码

在此仅举一个简单的例子来说明如何用diff/patch工具维护源码升级。

假设program-1.0目录中为老版,现开发完成的新版位于program-2.0目录中,将两个目录置于同一父目录下,然后在该父目录上执行:

diff -Nur program-1.0 program-2.0 >program-2.0.patch

将生成一个program-2.0.patch的补丁文件,发布该补丁文件(当然可以先压缩成bzip2格式)。

假设拿到的是program-2.0.patch.bz2文件,则在program-1.0目录同级执行:

bzcat program-2.0.patch.bz2 | patch -p0

如此即完成了从1.0到2.0的升级。

如果希望恢复到原版本,可以使用-R(--reverse)参数,但仅对上下文格式的diff文件有效。还有一个备份参数也可以使用,但简单应用中,整个目录备份可能更方便一些。

参考资料

  • Patch手册页
  • Diff手册页

关于作者

杨沙洲,目前在国防科技大学计算机学院攻读软件方向博士学位。您可以通过 pubb@163.net与他联系。

转载于:https://www.cnblogs.com/napoleon_liu/archive/2011/01/31/1948217.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[html] 当页面中使用application/xhtml+xml会出现什么问题吗?

[html] 当页面中使用application/xhtmlxml会出现什么问题吗&#xff1f; 要求比较严格&#xff0c;必须有head、body标签且每个元素必须是关闭的。一些老的浏览器不支持&#xff0c;实际上&#xff0c;任何最新的浏览器都将支持application/xhtmlxml媒体类型。大多数浏览器也接…

html5 本地保存大数据库,HTML5本地储存 - jellydd的个人空间 - OSCHINA - 中文开源技术交流社区...

传统方式我们用document.cookie来储存&#xff0c;但是储存大小较小&#xff0c;而且解析复杂&#xff0c;HTML5提出新的解决方案&#xff0c;使用sessionStorage和localStorage存储数据。localStorage&#xff1a;1. 永久生效2. 多窗口共享3. 容量大约为20M◆window.localStor…

[html] H5的Web Storage带来什么好处?

[html] H5的Web Storage带来什么好处&#xff1f; 存储的数据量更大&#xff0c;可以达到 5M&#xff1b;减少不必要的数据请求&#xff0c;不会自动把数据发送给服务器localStorage 可以把数据永久保存在本地&#xff0c;除非显示的清除或删除数据支持事件通知机制API 更加方便…

「BZOJ2654」tree

「BZOJ2654」tree 最小生成树二分答案。 最开始并没有觉得可以二分答案&#xff0c;因为答案并不单调啊。 其实根据题意&#xff0c;白边的数目肯定大于need条&#xff0c;而最小生成树的白边数并不等于need&#xff08;废话&#xff09;&#xff0c;可以二分将每条白边的权值m…

jQuery 结合 Json 提交数据到Webservice,并接收从Webservice返回的Json数据

简单的Json数据提交 jQuery ajax webservice&#xff1a;get 和 post 一、GET 方式客户端代码vardata { classCode: "0001"}; //这里要直接使用JOSN对象$.ajax({ type: "GET", contentType: "application/json; chars…

html服务器框架,一种类似http/html的分布式GUI程序设计框架

笔者构想了一种类似http/html的分布式GUI程序设计框架&#xff0c;适用于WIndows、桌面Linux、Mac OS以及C&#xff0c;Java&#xff0c;Python等多种支持GUI编程的程序设计系统。但是对于手机小屏幕&#xff0c;可能不合适。本系统包括窗口描述规则;gui.exe -- 一个命令行程序…

X86逆向教程10:学会使用硬件断点

本节课我们将学习硬件断点的使用技巧&#xff0c;硬件断点是由硬件提供给我们的一组寄存器&#xff0c;我们可以对这些硬件寄存器设置相应的值&#xff0c;然后让硬件帮我们断在需要下断点的地址上面&#xff0c;这就是硬件断点&#xff0c;硬件断点依赖于寄存器&#xff0c;这…

PHP获取IP的多种方式解析

转自&#xff1a;http://developer.51cto.com/art/200911/164514.htm PHP获取IP的方法有许多种&#xff0c;我们今天向大家总结了六种方法&#xff0c;希望通过对这六种方法的学习&#xff0c;能够加深我们对PHP语言的进一步了解&#xff0c;巩固我们所掌握的知识。 PHP获取IP方…

html 监控键盘,后台监控鼠标和键盘(可监听全局的鼠标以及键盘按键)

资源下载此资源下载价格为3D币&#xff0c;请先登录资源文件列表MouseKeyboardLibrary/MouseKeyboardLibrary/app.config , 134MouseKeyboardLibrary/MouseKeyboardLibrary/bin/Debug/MouseKeyboardLibrary.exe , 23040MouseKeyboardLibrary/MouseKeyboardLibrary/bin/Debug/Mo…

SQL优化34条

我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习、摘录、并汇总部分资料与大家分享&#xff01;&#xff08;1&#xff09; 选择最有效率的表名顺序(只在基于规则的优化器中有效)&#xff1a;ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名&#xff…

POJ 3258 River Hopscotch

题目链接&#xff1a;https://vjudge.net/problem/POJ-3258 题目大意 给定数轴上一个起点 0&#xff0c;终点 L&#xff0c;以及中间 N 个不同的点&#xff0c;现准备删除中间 N 个点中的 M 个&#xff0c;使得剩下来的点&#xff08;包括起点和终点&#xff09;&#xff0c;相…

2021泉州高考学校成绩查询,2021泉州市地区高考成绩排名查询,泉州市高考各高中成绩喜报榜单...

距离2018年高考还有不到一个月的时间了&#xff0c;很多人在准备最后冲刺的同时&#xff0c;也在关心高考成绩。2018各地区高考成绩排名查询,高考各高中成绩喜报榜单尚未公布&#xff0c;下面是往年各地区高考成绩排名查询,高考各高中成绩喜报榜单&#xff0c;想要了解同学可以…

转载:CEO如何“养好CIO同时管好CIO”?

http://www.enet.com.cn/article/2010/1214/A20101214800028.shtml 在现代企业经营理论中&#xff0c;有个着名的“二八定律”&#xff0c;即人才对企业贡献而言&#xff0c;常常是20%的人做出了80%的企业效益。显而易见&#xff0c;这“20%”就是企业的骨干与核心。而这“20%”…

PL/SQL中模拟EBS上下文

有时&#xff0c;我们需要查询的表或视图&#xff0c;是具有OU屏蔽的&#xff0c;这时我们就需要模拟EBS中的上下文来实现查询数据。 BEGIN fnd_global.apps_initialize(user_id >1,resp_id > 2,resp_appl_id >3); mo_global.init(ONT); END; 上述参数的获取&#xff…

[html] 一般习惯把js写在</body>前,但有例外的情况吗?说说看

[html] 一般习惯把js写在前&#xff0c;但有例外的情况吗&#xff1f;说说看 js的放置位置有三种&#xff1a; &#xff08;1&#xff09;放在head标签内 &#xff08;2&#xff09;放在body标签内 &#xff08;3&#xff09;外部script个人简介 我是歌谣&#xff0c;欢迎和大…

计算机桌面设计总结及体会,计算机基础学习心得

计算机基础学习心得 相关内容:计算机硬件是指计算机系统中由电子&#xff0c;机械和光电元件等组成的各种物理装置的总称。下面是第一范文网带来的计算机硬件实习心得体会&#xff0c;欢迎欣赏。计算机硬件实习心得体会一&#xff1a;一、实习目的&#xff1a;1、练习和巩固识别…

POJ 2676 Sudoku【DancingLinks,数独】

http://poj.org/problem?id2676POJ 2676 Sudoku也是求解规模为9*9的数独问题&#xff0c;与POJ 3074 Sudoku相同的问题&#xff0c;只是修改了输入输出格式而已。。。所以也不废话了&#xff0c;嘿嘿。。。 #include<stdio.h> #include<string.h> const int MAX_C…

Unittest方法 -- 测试固件(TestFixture)

前置和后置 1.setUp&#xff1a;在写测试用例的时候&#xff0c;每次操作其实都是基于打开浏览器输入对应网址这些操作&#xff0c;这个就是执行用例的前置条件。2.tearDown&#xff1a;执行完用例后&#xff0c;为了不影响下一次用例的执行&#xff0c;一般有个数据还原的过程…

[html] 如何关闭HTML页面在IOS下的键盘首字母自动大写?

[html] 如何关闭HTML页面在IOS下的键盘首字母自动大写&#xff1f;&#xff1f; autocapitalize"none"或"off"个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一…

所谓语音合成 是计算机根据语言学,计算语言学完整1

计算语言学第一节计算语言学概说概念&#xff1a;计算语言学(computational linguistics)是用计算机研究和处理自然语言的一门新兴边缘学科。涉及语言学、计算机科学、数学等多个领域。旨在通过建立形式化的数学模型&#xff0c;来分析处理自然语言&#xff0c;并在计算机上用程…