有两个目录
每个目录中有一个相同名字的文件 但是内容 是些地方有差别,我们以此来做实验 验证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取消上次打的补丁