linux下patch的制作与应用

来源:互联网 发布:ftp.redflag linux 编辑:程序博客网 时间:2024/06/06 19:07
0.前言  
  只要是产品性的程序开发,就无法避免版本更新,bug修正等。在linux下,提供了diff和patch这样一对配套工具来制作和应用补丁程序,以方便版本演进和代码修正。
  diff和patch的配套典型用法有如下三种:
  1. 为单个文件制作和打补丁。
  2. 为整个项目(修改了多个目录下的多个文件)制作和打补丁。
  3. 使用别人制作好的补丁程序给自己的项目打上该补丁程序。
  本文第一部分实例讲解上述三种用法。每二部分再详细介绍diff和patch各个参数的意义


I.diff和patch的用法实例
1. 为单个文件制作和打补丁
  1. #diff xxx_original.ext xxx_modified.ext > xxx.patch
    意即:xxx.patch = xxx_modified.ext - xxx_original.ext;
  1. #patch xxx_original.ext < xxx.patch
     为文件"xxx_orginal.ext"打上补丁"xxx.patch"。
     意即: xxx_modified.ext = xxx_orginal.ext + xxx.patch
如果你怀疑补丁程序"xxx.patch"可能有问题,想回滚到补丁之前的版本。则可以使用"-R"选项做到。
  1. patch -R xxx_modified.ext < xxx.patch
      意即:xxx_origian.ext = xxx_modified.ext - xxx.patch。

2. 为整个项目(因为修改了项目下多个目录下的多个文件)制作和应用补丁
应用场景设定为:
  project_original : 为要打补丁的项目目录名;
  project_modified : 为修改了多个目录下多个文件的项目目录名;
目的是想制作一个补丁程序,将"project_modified"中你所做的修改都更新到"project_original"中去。为达到这个目的,可以操作如下:
  1. #diff -Nur project_orginal/ project_modified/ > project.patch
  2. #cp project.patch project_original/
  3. #cd project_original/
  4. #patch -p1 < project.patch
例如,我想将我的ffmpeg项目升级到ffmpeg-0.10版本,但是我在ffmpeg-0.8.5版本中做了很多的bug修正和功能代码添加,这时我想将这些修改一次性添加到新ffmpeg-0.10版本中去,这样我就能在升级版本的同时,将已做的工作也自动添加。
实现如下:
  1. # diff -Nur ffmpeg-0.10/ ffmpeg-0.8.5.verified/ >ffmpeg-0.8.5.diff
  2. # cp ffmpeg-0.8.5.diff ./ffmpeg-0.10
  3. # cd ffmpeg-0.10
  4. # patch -p1 <ffmpeg-0.8.5.diff
3. 使用别人做好的补丁程序为我的程序打上该补丁 
  1. #cp xxx.patch project/
  2. #cd project/
  3. #patch -p1 < xxx.patch
如果想回滚到打这个补丁之前的版本,也很方便,紧接着上面的程序,使用一个命令做到:
  1. #patch --p1 < xxx.patch

II. diff和patch的参数解释

(本小段摘自http://linux.ccidnet.com/art/3067/20070418/1064163_1.html)
1.diff

NAME

diff - find differences between two files

SYNOPSIS

diff [options] from-file to-file

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

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

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

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

2. patch

NAME

patch - apply a diff file to an original

SYNOPSIS

patch [options] [originalfile [patchfile]]

but usually just

patch -pnum

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

-p0 选项要从当前目录查找目的文件(夹)

-p1 选项要忽略掉第一层目录,从当前目录开始查找。

在这里以实例说明:

--- old/modules/pcitable Mon Sep 27 11:03:56 1999

+++ new/modules/pcitable Tue Dec 19 20:05:41 2000

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

如果使用参数-p1,那就表示忽略第一层目录(即不管old),从当前目录寻找 modules的文件夹,在它下面找pcitable。这样的前提是当前目录必须为modules所在的目录。而diff补丁文件则可以在任意位置,只要 指明了diff补丁文件的路径就可以了。当然,可以用相对路径,也可以用绝对路径。不过我一般习惯用相对路径。

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

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

3. 我自己翻译的diff和patch的man帮助文档可以参见本人另外的博文
原创粉丝点击