`

补丁(patch)的制作与应用

阅读更多

转自http://linux-wiki.cn/wiki/zh-hans/%E8%A1%A5%E4%B8%81(patch)%E7%9A%84%E5%88%B6%E4%BD%9C%E4%B8%8E%E5%BA%94%E7%94%A8

如果hack了开源代码,为了方便分享(如提交Bug)或自己留存使用,一般都要制作一个补丁(Patch)。在从源码安装软件时,也难免要应用些别人做好的补丁。本文介绍如何制作和应用补丁。[1]

Hint.gif
提示: 
本文目前的多数内容是对《Linux下patch的制作和应用》的修正、整理与重新排版。

目录

[隐藏]

命令简介

用到的两个命令是diff和patch。

diff

diff可以比较两个东西,并可同时记录下二者的区别。制作补丁时的一般用法和常见选项为:

diff 【选项】 源文件(夹) 目的文件(夹)
-r
递归。设置后diff会将两个不同版本源代码目录中的所有对应文件全部都进行一次比较,包括子目录文件。
-N
选项确保补丁文件将正确地处理已经创建或删除文件的情况。
-u
输出每个修改前后的3行,也可以用-u5等指定输出更多上下文。
-E, -b, -w, -B, --strip-trailing-cr
忽略各种空白,可参见文档,按需选用。

patch

patch的作用则是将diff记录的结果(即补丁)应用到相应文件(夹)上。最常见的用法为:

patch -pNUM <patchfile>
-p Num
忽略几层文件夹,随后详解。
-E
选项说明如果发现了空文件,那么就删除它
-R
取消打过的补丁。

为了解释 -p 参数,需要看看如下patch文件片段:

--- 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。

应用

利用以上命令,处理单个文件补丁的方法:

# 产生补丁
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
 
# 打补丁
cd to-docu
patch -p1 < to-docu.patch
 
# 取消补丁
patch -R -p1 <to-docu.patch

另外,使用版本控制工具时,可以直接用svn diffgit diff生成补丁文件。

值得一提的是,由于应用补丁时的目标代码和生成补丁时的代码未必相同,打补丁操作可能失败。补丁失败的文件会以.rej结尾,下面命令可以找出所有rej文件:

find . -name '*.rej'

patch文件构成

补丁文件里到底存储了哪些信息呢?看看这个例子:

--- test0       2006-08-18 09:12:01.000000000 +0800
+++ test1       2006-08-18 09:13:09.000000000 +0800
@@ -1,3 +1,4 @@
+222222
 111111
-111111
+222222
 111111
补丁头
补丁头是分别由---/+++开头的两行,用来表示要打补丁的文件。---开头表示旧文件,+++开头表示新文件。
一个补丁文件中的多个补丁
一个补丁文件中可能包含以---/+++开头的很多节,每一节用来打一个补丁。所以在一个补丁文件中可以包含好多个补丁。
块是补丁中要修改的地方。它通常由一部分不用修改的东西开始和结束。他们只是用来表示要修改的位置。他们通常以@@开始,结束于另一个块的开始或者一个新的补丁头。
块的缩进
块会缩进一列,而这一列是用来表示这一行是要增加还是要删除的。
块的第一列
+号表示这一行是要加上的。-号表示这一行是要删除的。没有加号也没有减号表示这里只是引用的而不需要修改。

实例分析

单文件补丁

设当前目录有文件 test0

111111
111111
111111

和文件test1

222222
111111
222222
111111

使用diff创建补丁test1.patch

diff -uN test0 test1 > test1.patch

因为是单个文件,故不需要 -r 选项。此命令得到如下补丁:

--- test0       2006-08-18 09:12:01.000000000 +0800
+++ test1       2006-08-18 09:13:09.000000000 +0800
@@ -1,3 +1,4 @@
+222222
 111111
-111111
+222222
 111111

要应用补丁,只需:

$ patch -p0 < test1.patch
patching file test0

此时test0就和test1一样了。

如果要取消补丁做出的更改,恢复旧版本:

$ patch -RE -p0 < test1.patch
patching file test0

文件夹补丁

设有如下环境:

--prj0/
     test0
     prj0name
--prj1/
     test1
     prj1name

prj0/prj0name内容为如下三行:

--------
prj0/prj0name
--------

prj1/prj1name内容为如下三行:

--------
prj1/prj1name
--------

用 diff -uNr 创建补丁,

diff -uNr prj0 prj1 > prj1.patch

得到的patch文件为:

diff -uNr prj0/prj0name prj1/prj0name
--- prj0/prj0name       2006-08-18 09:25:11.000000000 +0800
+++ prj1/prj0name       1970-01-01 08:00:00.000000000 +0800
@@ -1,3 +0,0 @@
---------
-prj0/prj0name
---------
diff -uNr prj0/prj1name prj1/prj1name
--- prj0/prj1name       1970-01-01 08:00:00.000000000 +0800
+++ prj1/prj1name       2006-08-18 09:26:36.000000000 +0800
@@ -0,0 +1,3 @@
+---------
+prj1/prj1name
+---------
diff -uNr prj0/test0 prj1/test0
--- prj0/test0  2006-08-18 09:23:53.000000000 +0800
+++ prj1/test0  1970-01-01 08:00:00.000000000 +0800
@@ -1,3 +0,0 @@
-111111
-111111
-111111
diff -uNr prj0/test1 prj1/test1
--- prj0/test1  1970-01-01 08:00:00.000000000 +0800
+++ prj1/test1  2006-08-18 09:26:00.000000000 +0800
@@ -0,0 +1,4 @@
+222222
+111111
+222222
+111111

如果要应用此补丁,则:

$ ls
prj0  prj1  prj1.patch
$ cd prj0
$ patch -p1 < ../prj1.patch
patching file prj0name
patching file prj1name
patching file test0
patching file test1

此时可用ls看到打补丁后的结果:

$ ls
prj1name  test1

类似的,如果要回滚补丁操作:

$ patch -R -p1 < ../prj1.patch
patching file prj0name
patching file prj1name
patching file test0
patching file test1
$ ls
prj0name  test0

参考资料

  1.  Linux下patch的制作和应用

本文对您有帮助?分享给更多朋友!

 

分享到:
评论

相关推荐

    Linux下patch的制作和应用

    # Linux 下 Patch 的制作与应用详解 ## 一、引言 在 Linux 开发和维护过程中,经常需要对源代码进行修改以适应不同的需求。为了方便地管理这些更改,并能够轻松地将更改应用到新的代码版本中,使用 `patch` 和 `...

    PATCH补丁工具 .rar

    总的来说,"PATCH补丁工具 .rar" 提供了一个学习软件补丁开发的实践环境,尤其对易语言初学者而言,这是一个很好的起点,能够帮助他们掌握补丁制作的核心技术,包括动态补丁、特征码补丁和寄存器Hook等高级技巧。...

    openwrt知识总结 (开发教程+补丁 patch)

    OpenWRT知识总结(开发教程+补丁patch) OpenWRT是一款基于Linux的路由器操作系统,旨在提供一个高度可定制和灵活的解决方案,满足不同用户的需求。本文档旨在总结OpenWRT的开发教程和补丁patch,帮助开发者和用户...

    补丁制作工具2006121321324995.rar

    综上所述,"补丁制作工具2006121321324995.rar" 压缩包涉及了补丁制作的整个过程,包括工具的使用、补丁的生成、测试以及应用等环节,对于软件开发和维护人员来说,理解并掌握这些知识点是至关重要的。

    补丁工具BayMax Patch Tools.rar

    动态补丁工具如BayMax Patch Tools,能够在程序运行时进行修改,无需重新编译或安装整个应用程序,提高了维护效率。 2. **Baymax**: Baymax 是这款补丁工具的核心组件,可能是一个自定义的脚本引擎或者一个包含...

    Linux下Patch的应用和制作方法

    因为在u-boot移植过程中,有几处通用文件要修改,如果每次都要手动修改就太麻烦了。制作补丁可以解决这个问题。本文首介绍一下diff和patch。然后介绍了制作Patch为单个文件和多个文件进行补丁操作的方法。

    Linux下Patch的应用和制作方法介绍.docx

    `patch`工具则是用来应用`diff`生成的补丁文件到原始文件上,实现源文件到目标文件的转换。`-p`选项用于指定路径前缀的层数,例如`-p0`表示从当前目录查找,`-p1`则忽略第一层目录。`-E`选项删除补丁应用后产生的空...

    openwrt 制作patch

    - package patch:与应用或第三方库相关的补丁。 5. **创建Patch的步骤**: - 准备内核源码树并准备源码,使用命令`make target/linux/{clean,prepare} V=s QUILT=1`。 - 进入内核源码顶层目录,并使用`quilt ...

    ISO打补丁软件PPF

    PPF(Patch-Package Format)补丁是一种高效且便捷的方式,允许用户将特定的更改应用到ISO文件上,而无需解压整个ISO并重新打包。这种技术在系统管理员、软件开发者和爱好者之间非常流行,因为它节省了时间和硬盘...

    田岛绣花7.0xp-patch错误补丁

    田岛绣花软件是一款在刺绣行业内广泛应用的专业设计与制作工具,主要服务于刺绣爱好者和专业人士。这款软件的版本众多,其中田岛绣花7.0xp是一个针对Windows XP操作系统优化的版本。然而,如同任何软件一样,它可能...

    9点素材制作工具Nine-Patch Editor1_0_0_3

    Nine-Patch Editor1_0_0_3是专为Android平台设计的一款强大的9点素材制作工具,它使得开发者和设计师能够高效地创建适应不同屏幕尺寸和分辨率的图像资源。9点切图技术在Android开发中扮演着至关重要的角色,因为它...

    内存补丁load制作实例,Win32ASM源码.zip_memory patch_win32asm_内存 补丁_内存补丁

    3. **编写补丁代码**:使用Win32ASM编写汇编代码,这段代码将在运行时应用到目标内存地址。这可能包括替换原有数据、跳转到新的处理代码或者修改内存保护属性。 4. **加载和执行补丁**:补丁程序运行后,它会找到...

    IndigoRoseVisualPatch(补丁包制作工具)v3.6英文安装免费版

    Indigo Rose Visual Patch是一款非常实用的软件补丁包制作工具,软件拥有可视化的用户界面和灵活的用户向导,可以方便用户快速制作出实用又漂亮的软件补丁,一般软件开发人员在对程序进行更新的时候可以使用这款工具...

    uboot 补丁制作

    有时候为了修复uboot中的bug或添加新的功能,开发者需要制作一个补丁(patch),以方便地将修改应用到不同的uboot版本上。 制作uboot补丁的基本步骤如下: 1. 清理工程。在开始制作补丁之前,需要清理之前的所有...

    ArcGIS1022Patch.zip

    通过应用这个补丁,用户可以避免因编码问题导致的数据显示异常,提高数据交换的兼容性和准确性。对于依赖ArcGIS进行数据处理和共享的用户来说,及时安装这类补丁至关重要,它能有效提升工作效率,减少不必要的数据...

    ArcGIS-1022-DT-SSDCP-Patch.msp

    ArcGIS是由Esri公司开发的一款全球领先的地理信息系统(GIS)软件,广泛应用于地理数据分析、地图制作、空间建模等多个领域。ArcGIS 10.2.2是该系列的一个版本,提供了一套全面的工具和技术,使用户能够有效地管理和...

    补丁包制作

    在描述中提到的“工具”可能指的是用于创建、管理和应用补丁的工具,例如patch、 quilt 或者 Git本身。这些工具可以帮助开发者更高效地处理补丁,比如跟踪补丁的应用状态,解决合并冲突,以及在多个补丁之间进行切换...

    Baymax Patch Tools v2.9.1 Hb.rar

    - **兼容性**:并非所有的patch都适用于所有版本的软件,因此在应用前需确保patch与目标软件的版本匹配。 - **安全风险**:不正确的patch应用或来源不明的patch可能会引入新的安全问题,因此只应使用来自可靠源的...

    winpatch补丁工具

    "winpatch补丁工具"是一个专门用于Windows平台的补丁制作工具,它可以帮助用户将修改后的文件转换为可加载的补丁,尤其适用于游戏或者应用程序的个性化调整。在本案例中,描述提到的是针对"冒险WZ"的补丁制作过程,...

    解决Arcgis10.6版本反应慢的补丁

    这个名为"ArcGIS-106-DT-DIP-Patch.msp"的压缩文件就是解决这些问题的补丁。它是一个Microsoft Installer(MSI)包,这种类型的安装文件通常用于Windows系统上的软件更新和修复。用户只需下载这个补丁文件,然后在...

Global site tag (gtag.js) - Google Analytics