生成补丁 与 打补丁 diff patch

有两个目录
每个目录中有一个相同名字的文件  但是内容 是些地方有差别,我们以此来做实验 验证diff patch 这两个命令
目录1:/you 包含file.c 这个文件比下面的file.c文件 多了一段代码 模仿我们在更新文件时 在源文件上做的修改
//////////////////////
#include "delegation.h"
static int nfs_lock(struct file_lock *fl)
{
    int ret = -ENOLCK;
}
static int liq( void )
{
    ret = do_getlk(filp, cmd, fl);       
}
static int openlv( void )
{
    do_unlk(filp, cmd, fl);       
}
//////////////////////
目录2:/meiyou 包含file.c
///////////////////////////
#include "delegation.h"
static int nfs_lock(struct file_lock *fl)
{
    int
ret = -ENOLCK;
}
static int openlv( void )
{
    do_unlk(filp,
cmd, fl);       
}
///////////////////////////
diff -uNr meiyou you > mypatch.patch
////////////////////////////////////
diff -uNr meiyou/file.c you/file.c
--- meiyou/file.c    2010-12-13 00:37:24.000000000 +0800
+++ you/file.c    2010-12-13 00:40:52.000000000 +0800
@@ -6,6 +6,10 @@
     int ret = -ENOLCK;
 }
+static int liq( void )
+{
+    ret = do_getlk(filp, cmd, fl);       
+}
 static int openlv( void )
 {
/////////////////////////////////////
1、diff
diff的功能就是用来比较两个文件或者文件夹的不同,然后记录下来,也就是所谓的diff补丁。
diff  -options【选项】  A【源文件(夹)】 B【目的文件(夹)】
源文件 就是希望被修改的文件
目的文件就是希望源文件通过补丁修改后变成的文件
这也就是升级
下面介绍三个最为常用选项:

-r 是一个递归选项,设置了这个选项,diff会将两个不同版本源代码目录中的所有对应文件全部都进行一次比较,包括子目录文件。

-N 选项确保补丁文件将正确地处理已经创建或删除文件的情况。

-u 选项以统一格式创建补丁文件,这种格式比缺省格式更紧凑些。

diff -uN ./meiyou/file.c  ./you/file.c > mypatch.patch

单独的两个文件比较 用-rN即可 补丁的开头没有diff 指明比较的文件 因为就是两个文件比较 不像两个目录比较 里面有很多文件要比较 所以要用diff开头指明比较的文件

diff -uNr meiyou you > mypatch.patch

-uNr diff 命令会比较两个文件夹中的所有文件 以及子目录中的文件

2、patch
patch命令就是打补丁 将 用diff命令生成的补丁文件打到补丁中指定的路径 指定的文件上 源文件(夹)――>目的文件(夹),也可以目的文件(夹)――>源文件(夹)。下面介绍几个最常用选项:

-p0 根据补丁中的完整路径meiyou/file.c you/file.c,在当前目录寻找file.c这个要打补丁的文件

-p1 根据补丁中的完整路径meiyou/file.c you/file.c
且忽略第一层路径 相当于路径变为file.c file.c,这里的情况就是当前目录就包含目的文件,在当前目录寻找file.c这个要打补丁的文件

因为作者建立补丁的时候 一般是将源文件拷贝到一个新目录 来做修改的 这个我们可以查看补丁包里面的路径 就可以知道 所以我们一般要忽略第一层目录 用-p1 把补丁拷贝到源文件所在的目录下去打包

************************************************************

patch -p0/1 < patchfile

在这里以实例说明:

diff -uNr meiyou/file.c
you/file.c
--- meiyou/file.c    2010-12-13 00:37:24.000000000 +0800
+++ you/file.c    2010-12-13 00:40:52.000000000 +0800

    如果使用参数-p0,那就表示从当前目录找一个叫做meiyou的文件夹,在它下面寻找file.c文件来执行patch操作。

    如果使用参数-p1,那就表示忽略第一层目录(即不管meiyou),从当前目录寻找file.c的文件。

************************************************************

patch文件的结构

补丁头

补丁头是分别由---/+++开头的两行,用来表示要打补丁的文件。---开头表示旧文件,+++开头表示新文件。

一个补丁文件中的多个补丁

一个补丁文件中可能包含以---/+++开头的很多节,每一节用来打一个补丁。所以在一个补丁文件中可以包含好多个补丁。

块是补丁中要修改的地方。它通常由一部分不用修改的东西开始和结束。他们只是用来表示要修改的位置。他们通常以@@开始,结束于另一个块的开始或者一个新的补丁头。

块的缩进

块会缩进一列,而这一列是用来表示这一行是要增加还是要删除的。

块的第一列

+号表示这一行是要加上的。

-号表示这一行是要删除的。

没有加号也没有减号表示这里只是引用的而不需要修改。

************************************************************

-E 选项说明如果发现了空文件,那么就删除它

-R 选项说明在补丁文件中的“新”文件和“旧”文件现在要调换过来了(实际上就是给新版本打补丁,让它变成老版本)

打补丁失败时  会生产.rjc的文件  我们可以把所以的生产的.rjc文件搜集起来 查看

find . -name "*.rjc" > reject.file 来查看

小结:

 

单个文件

diff –uN from-file to-file >to-file.patch

patch –p0 < to-file.patch

patch –RE –p0 < to-file.patch

多个文件

diff –uNr from-docu to-docu >to-docu.patch

patch –p1 < to-docu.patch

patch –R –p1 <to-docu.patch / patch
–p1 <to-docu.patch -R取消上次打的补丁

时间: 2024-11-10 11:48:44

生成补丁 与 打补丁 diff patch的相关文章

Linux diff patch

/***************************************************************************** * Linux diff patch * 声明: * 经常需要给代码打补丁,但是发现自己不会打补丁,经常看着补丁改代码,效率 * 那是一个低啊,不会就学学呗,反正patch有-R回退,不怕出错. * * 2015-12-28 深圳 南山平山村 曾剑锋 *********************************************

03_TortoiseGit冲突和补丁演示,补丁冲突

 1 下载TortoiseGit,下载地址: http://tortoisegit.soft32.com/free-download/ 2 创建一个GIT仓库 3 创建克隆,创建两个用于克隆的仓库 进入user1,克隆一个 同样的方法进入user2,克隆一个仓库 4 提交文件 点击Push,将文件push到远程服务器上. 4 通过pull的方式将文件更新到user2中 进入user2中,执行以下操作: 执行之后的目录中的内容如下: 5 创建补丁(在user1修改了文件之后,还没有push之前

Linux制作补丁与打补丁简单用法

PATTERN:字符串 patch -p0 < hello1.patch 进入到文件里面就用-p1  diff -urN src dst > patch        生成patch find PATH -name "hello*"       //PATH路径省略就是默认当前目录下 grep  "PATTERN"  PATH -nR      //PATH路径不要省略,当前目录就是./

打补丁无需重启补丁有望合并到 Linux 内核

甲骨文的Ksplice,SUSE的kGraft和Red Hat的kpatch,是三种不用重启就能为Linux Kernel打补丁的机制,这项功能对于基础设施运营商具有重要价值.现在,内核Live Patching机制有望在未来合并到内核主支. Red Hat的高级软件工程师Seth Jennings 在邮件列表上描述了正 在开发的内核Live Patching方案,该方案使用了 基于ftrace的机制和内核接口,代表了kpatch和kGraft最常用的功能集,能接受kGraft和 Kpatch构

Windows 7怎么更新补丁 Windows 7补丁更新的教程

1.在电脑中双击桌面上的[计算机],选择[控制面板]如下图红圈所示.        2.之后你再找到[windows update]然后我们点击下面的[检查更新]按钮,细节如下图所示.        3.下载更新程序     4.更新完成重新启动,完成更新     操作步骤是非常的简单的了,只需要简单的四步就可以了,希望文章对各位会有所帮助

diff 命令用法--如何打补丁【原创--学习笔记】

diff 命令用法 1."-u":表示在比较结果中输出上下文中一些相同的行,这有利于人工定位 2."-r":表示递归比较各个子目录下的文件 3."-N":将不存在的文件当作空文件 4."-w":忽略对空格的比较 5."-B":忽略对空行的比较 例如:假设Linux-2.6.22.6目录中是原始的内核,Linux-2.6.22.6_ok目录中是修改后的内核,可以使用以下命令制作补丁文件linux-2.6.22

Oracle Patch补丁体系和如何打补丁

Oracle作为大型商用关系型数据库,从其补丁体系就可以看出其考虑的全面性.首先我们看下Oracle Patch的主要类型[参考1和2]: Version/维护版本 针对前一个维护版本的所有补丁进行整理,增加新的功能或对软件有较大的改动,进行整体测试,得到一个软件版本"包",称为版本Version.比如 11.2. One-off patches (e.g. a bug fix) One-off patches也称之为一次性补丁,通常针对特定的版本数据库或运行平台.此类补丁通常较小,使

diff and patch

 转两篇diff和patch的文章, 打补丁相关.第一篇 :  情景一:你正尝试从代码编译一个软件包,发现有人已经对代码进行了小小的修改以便在你的系统上编译.他们通过补丁的方式发布自己的成果,但是你却不知道该如何使用它.答案是你使用一个叫做patch(很贴切)的命令行工具将补丁应用到原始代码上.  情景二:你下载了一个开源软件包的代码,花了一个小时左右稍作修改,成功的让它在你的系统上编译通过.你想把自己的成果分享给其他程序员,或者给软件包的作者.现在你就需要创建自己的补丁,你需要的工具是diff

Linux中的Diff和Patch

本文主要记录两个命令的学习情况:diff 和 patch.diff 和 patch 是一对工具,使用这对工具可以获取更新文件与历史文件的差异,并将更新应用到历史文件上.在数学上说,diff就是对两个集合的差运算,patch就是对两个集合的和运算. 简单的例子 使用这个例子来说明如何进行文件的对比和打补丁. 这里有两个文件 original.txt 和 updated.txt,如下: #include <stdio.h> function old(){ printf("This is