linux patch的制作与使用方法

发布时间:2019-11-23编辑:脚本学堂
本文介绍下,在linux中制作与使用patch补丁的方法,以实现不同版本的更新,有需要的朋友参考下吧。

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

I.diff和patch的用法实例
1,为单个文件制作和打补丁
 

复制代码 代码示例:

#diff xxx_original.ext xxx_modified.ext > xxx.patch
即:xxx.patch = xxx_modified.ext - xxx_original.ext;

#patch xxx_original.ext < xxx.patch
为文件"xxx_orginal.ext"打上补丁"xxx.patch"。
即: xxx_modified.ext = xxx_orginal.ext + xxx.patch

如果想回滚到补丁之前的版本。则可以使用"-R"选项做到。
patch -R xxx_modified.ext < xxx.patch
即:xxx_origian.ext = xxx_modified.ext - xxx.patch。

2,为整个项目(因为修改了项目下多个目录下的多个文件)制作和应用补丁
应用场景设定:
  project_original : 为要打补丁的项目目录名;
  project_modified : 为修改了多个目录下多个文件的项目目录名;
目的是想制作一个补丁程序,将"project_modified"中你所做的修改都更新到"project_original"中去。为达到这个目的,可以操作如下:
 

复制代码 代码示例:
#diff -Nur project_orginal/ project_modified/ > project.patch
#cp project.patch project_original/
#cd project_original/
#patch -p1 < project.patch

例如,将ffmpeg项目升级到ffmpeg-0.10版本,但是我在ffmpeg-0.8.5版本中做了很多的bug修正和功能代码添加,这时将这些修改一次性添加到新ffmpeg-0.10版本中去,这样即可在升级版本的同时,将已做的工作也自动添加。

实现如下:
 

复制代码 代码示例:
# diff -Nur ffmpeg-0.10/ ffmpeg-0.8.5.verified/ >ffmpeg-0.8.5.diff
# cp ffmpeg-0.8.5.diff ./ffmpeg-0.10
# cd ffmpeg-0.10
# patch -p1 <ffmpeg-0.8.5.diff

3. 使用别人做好的补丁程序为现有的程序打上该补丁
 

复制代码 代码示例:
#cp xxx.patch project/
#cd project/
#patch -p1 < xxx.patch

回滚到打这个补丁之前的版本,紧接着上面的程序,命令:
 

复制代码 代码示例:
#patch -R -p1 < xxx.patch

II. diff和patch的参数解释
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 选项说明在补丁文件中的“新”文件和“旧”文件现在要调换过来了(实际上就是给新版本打补丁,让它变成老版本)