非线性偏微分方程手册:diff命令打补丁详解!

来源:百度文库 编辑:九乡新闻网 时间:2024/04/27 16:05:26
使用diff命令打补丁详解!分类: linux操作系统 2011-08-09 10:35 9人阅读 评论(0) 收藏 举报

对于开源源码修改过程中的必经阶段:对源码打补丁,总是不够精通,搜索了补丁的原理的详细过程,如下:


在移植或版本升级过程中,手动比对(用比对工具)转换是很费力的事情,特别是发生变化的文件非常多的情况下,“制作补丁、打补丁”可以简化这个过程。主要用到diff和patch。在这里不会把man在线文档上所有的选项都介绍一下,那样也没有必要。在99%的时间里,我们只会用到几个选项。

1、diff

--------------------

NAME

      diff - find differences between two files

SYNOPSIS

      diff [options] from-file to-file

      from_file to_file can be a directory.

--------------------

简单的说,diff的功能就是用来比较两个文件的不同,然后记录下来,也就是所谓的diff补丁。
语法格式:diff 【选项】 源文件(夹) 目的文件(夹),就是要给源文件(夹)打个补丁,使之变成目的文件(夹),术语也就是“升级”。
下面介绍三个最为常用选项:

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

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

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

一般 -uN 是一直使用的参数,而 -r 如果是含子目录就使用,不含则不使用。

 

2、patch

------------------

NAME

       patch - apply a diff file to an original

SYNOPSIS

       patch [options] [originalfile[patchfile]]

       but usually just

       patch -pnum < patchfile

       带下划线的代表需要根据实际情况替换。比如 -pnum 实际使用时一般为 -p0, -p1。

------------------

简单的说,patch就是利用diff制作的补丁来实现源文件(夹)和目的文件(夹)的转换。这样说就意味着你可以由源文件(夹)――>目的文件(夹),也可以目的文件(夹)――>源文件(夹)。下面介绍几个最常用选项:

-pnum 是指查找patch文件中指定的文件时,忽略前num个目录,一个"/"为一层,详细内容下面解释。

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

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

 

3、patch文件的结构

(1)补丁头

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

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

--- linux-2.6.25/arch/alpha/boot/misc.c 2010-05-06 01:56:42.565397700 -0700
+++ linux-2.6.29/arch/alpha/boot/misc.c 2010-05-06 00:51:06.000000000 -0700

(2)块

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

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

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

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

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

 

4、-pnum

我们在生成补丁时,多是对目录进行操作,比如下面我对linux内核25和29两个版本arch目录下的文件做一个diff操作,生成的差异保存在arch.patch中:

diff -uNr linux-2.6.25/arch linux-2.6.29/arch > arch.patch

可以看到arch.patch开始位置的补丁头如下:

--- linux-2.6.25_android/arch/alpha/boot/misc.c 2010-05-06 01:56:42.565397700 -0700 (黄色部分为打patch时命令会查找的文件名)
+++ linux-2.6.29_android/arch/alpha/boot/misc.c 2010-05-06 00:51:06.000000000 -0700

patch -p0 patch -p1 patch -p2 以此类推,patch的目录不限,可以指定patch的目录。

这个功能使用的情景是:打补丁时的目录结构/目录名跟现在要打补丁的目录结构/目录名不一样。
比如上面的例子,这个patch很可能是别人打的,打补丁时目录为 linux-2.6.25/arch,而本地的目录可能是linux_kernel_2625,
那打补丁时就可以进入linux_kernel_2625,用命令patch -p1


5、常用命令

(1)单个文件比较

diff –uN from-file to-file > to-file.patch //生成补丁 【因为单个文件,所以不需要-r选项。选项顺序没有关系,即可以是-uN,也可以是-Nu】

patch –p0 < to-file.patch //打补丁

patch –R –p0 < to-file.patch //去除补丁

(2)目录比较

diff –uNr from-dir to-dir > to-dir.patch //生成补丁

cd from-dir

patch –p1 < to-dir.patch //打补丁

patch –R –p1 < to-dir.patch //去除补丁

 

6、为内核打补丁

(1)首先是解压,因为发布的补丁文件都是使用gzip压缩的。

$gunzip ../setup-dir/ patch-2.4.21-rmk1.gz

(2)然后进入你的内核源代码目录

$cd linux-2.4.21

(3)打补丁

$patch –p1 < ../../setup-dir/patch-2.4.21-rmk1

 

打完补丁后,需要检查一下有没有拒绝执行的文件,即检查.rej文件的存在。使用命令:

$find -name *.rej

 

参考文档:http://blog.chinaunix.net/u1/35795/showart_1131705.html


分享到: