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

news/2024/7/11 1:18:05 标签: patch, file, cvs, 工作, system, linux

【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

注:整理自网络。


http://www.niftyadmin.cn/n/1313714.html

相关文章

JVM体系结构 方法区详解

&#xff08;1&#xff09;类装载子系统 装载 连接 初始化 &#xff08;2&#xff09;方法区。被所有线程共享。垃圾收集也会清理方法区中的无用类型对象。 a. 类型信息。类加载器加载类时&#xff0c;从类文件中提取出来。 类的完整有效名 父类的完整有效名&#xff08;int…

豆瓣restful api 状态和错误码

豆瓣 API 通过HTTP Status Code来说明 API 请求是否成功 下面的表格中展示了可能的HTTP Status Code以及其含义 状态码含义说明200OK请求成功201CREATED创建成功202ACCEPTED更新成功400BAD REQUEST请求的地址不存在或者包含不支持的参数401UNAUTHORIZED未授权403FORBIDDEN被禁止…

JVM 中对象的生命周期

一共七个阶段&#xff1a; 创建阶段(Creation) 应用阶段(Using) 不可视阶段(Invisible) 不可到达阶段(Unreachable) 可收集阶段(Collected) 终结阶段(Finalized) 释放阶段(Free)

XSS练习小游戏和答案参考

源码&#xff1a;https://files.cnblogs.com/files/Eleven-Liu/xss%E7%BB%83%E4%B9%A0%E5%B0%8F%E6%B8%B8%E6%88%8F.zip 感谢源码作者提供了这样的环境。 我自己在本地虚拟机的路径&#xff0c;http://127.0.0.1/xss/ 打开后提示点击图片&#xff0c;进入第一关。 第一关&…

Java 中的内存泄漏 与 无意识的对象保留

&#xff08;1&#xff09;内存泄漏 和 无意识对象保留 JVM 不存在任何被证实的内存泄漏问题。垃圾收集器一般来说会精确的判断哪些对象可被收集&#xff0c;并且重新回收他们的内存空间。如果存在内存耗尽的错误&#xff0c;基本上是程序本身造成的。 C没有垃圾收集机制。C中存…

泛海沉读

C 1.std::cout<<"stackpoker"<<std::endl; 这里使用std::cout而不是cout是因为cout位于std名称空间中/名称空间的作用就是防止调用的功能因同时存在于几个地方&#xff0c;导致调用时发生冲突&#xff0c;所以要确认唯一。 使用名称空间&#xff1a;usin…

js实现php函数urlencode

本文介绍了php函数urlencode的js实现方法并比较js和php各编码函数的区别。 通常form表单的enctype类型为 application/x-www-form-urlencoded, 当表单提交后&#xff0c;提交的数据自动被编码&#xff0c; 规则为" 除了 -_. 之外的所有非字母数字字符都将被替换成百分号&a…

PATCH 将DIFF生成的补丁应用修补程序

PATCH 将DIFF生成的补丁应用修补程序 Usage: patch [OPTION]... [ORIGFILE [PATCHFILE]] Input options:输入选项 -p NUM --stripNUM 将num开头的文件忽略 Strip NUM leading components from file names. -F LINES --fuzz LINES 设置模糊因子lines为行号 ??????S…