使用和制作patch文件

使用和制作patch文件

发表时间: 2007-2-13 20:57    作者: superuser    来源: 迷茫人

字体: 小 中 大 | 打印

原文http://www.linuxsir.org/bbs/showthread.php?t=240802

今天上QQ的时候发现eva不能用了,后来又看到了解决方法,所以想打个补丁,只是不会:-)。后来查了查明确了,写了个总结,分享一下,也不知道曾经有没有这方面的东西,希望我这个不是多余的。

创建补丁文件:

CODE:

diff -Naur 旧的文件夹 新的文件夹 > patch文件
或者
diff -Naur 旧的文件 新的文件 > patch文件

对于文件夹层数的一些限制

在创建patch的时候文件夹的层数应当是一样的,比方

CODE:

--- old/modules/pcitableMon Sep 27 11:03:56 1999
+++ new/modules/pcitableTue Dec 19 20:05:41 2000

这样是能够的。

CODE:

--- old/try1/other/modules/pcitableMon Sep 27 11:03:56 1999
+++ new/modules/pcitableTue Dec 19 20:05:41 2000

这样做可能会有一些问题。

怎样使用patch
对于一个patch文件,有两种经常使用用法:
1.

CODE:

cat new-patch | patch -p02.

2、

CODE:

patch -p0 < new-patch

patch命令里面的层数(-p0?-p1?)
參数-p来指定从第几层開始比較。比方有一个patch文件的补丁头是这种:

CODE:

--- old/modules/pcitableMon Sep 27 11:03:56 1999
+++ new/modules/pcitableTue Dec 19 20:05:41 2000

假设使用參数-p0,就表示从当前文件夹,找一个叫作new的文件夹,在它以下找一个叫modules的文件夹,再在它以下找一个叫pcitableMon的文件夹。
假设使用參数-p1,就表示忽略第一层,从当前文件夹找一个叫modules的文件夹,在它以下找一个叫modules的文件夹。这样会忽略掉补丁头提到的new文件夹。
依此类推。

patch文件的结构
补丁头
补丁头是分别由---/+++开头的两行,用来表示要打补丁的文件。
一个补丁文件里的多个补丁
一个补丁文件里可能包括以---/+++开头的非常多节,每一节用来打一个补丁。所以在一个补丁文件里能够包括好多个补丁。

块是补丁中要改动的地方。它通常由一部分不用改动的东西開始和结束。他们仅仅是用来表示要改动的位置。他们通常以@@開始,结束于还有一个块的開始或者一个新的补丁头。
块的缩进
块会缩进一列,而这一列是用来表示这一行是要添加还是要删除的。
块的第一列
+号表示这一行是要加上的。
-号表示这一行是要删除的。
没有加号也没有减号表示这里仅仅是引用的而不须要改动。

一个patch的样例

CODE:

diff -u old/modules/pcitable new/modules/pcitable
--- old/modules/pcitableMon Sep 27 11:03:56 1999
+++ new/modules/pcitableTue Dec 19 20:05:41 2000
@@ -1,4 +1,6 @@
0x0e110xae10"cpqarray""Compaq|Smart-2/P RAID Controller"
+0x10000x0010"cpqarray""Compaq|Integrated Array Controller"
+0x10110x0046"cpqarray""Compaq|Smart-2/P RAID Controller"
0x0e110xae32"tlan""Compaq|Netelligent 10/100"
0x0e110xae34"tlan""Compaq|Netelligent 10"
0x0e110xae35"tlan""Compaq|Integrated NetFlex-3/P"
@@ -21,6 +23,7 @@
0x10000x000f"ncr53c8xx""Symbios|53c875"
0x10000x0012"ncr53c8xx""Symbios|53c895a"
0x10000x008f"ncr53c8xx""Symbios|53c875J"
+0x10000x000a"sym53c8xx""Symbios|53c1510"
0x10000x0701"yellowfin""Symbios|83C885 gigabit ethernet"
0x10000x0702"yellowfin""Symbios|Yellowfin G-NIC gigabit ethernet"
0x10110x0001"tulip""DEC|DECchip 21050"
--- old/usr/share/kudzu/pcitableSun Sep 26 17:11:23 1999
+++ new/usr/share/kudzu/pcitableTue Dec 19 20:05:41 2000
@@ -15,6 +15,8 @@
0x0e110x3034"unknown""Compaq|QVision 1280/p"
0x0e110x4000"unknown""Compaq|4000 [Triflex]"
0x0e110xa0f3"ignore""Compaq|Triflex PCI to ISA Bridge"
+0x10000x0010"cpqarray""Compaq|Integrated Array Controller"
+0x10110x0046"cpqarray""Compaq|Smart-2/P RAID Controller"
0x0e110xae10"cpqarray""Compaq|Smart-2/P RAID Controller"
0x0e110xae29"unknown""Compaq|MIS-L"
0x0e110xae2a"unknown""Compaq|MPC"
@@ -46,6 +48,7 @@
0x10000x000f"ncr53c8xx""Symbios|53c875"
0x10000x0012"ncr53c8xx""Symbios|53c895a"
0x10000x008f"ncr53c8xx""Symbios|53c875J"
+0x10000x000a"sym53c8xx""Symbios|53c1510"
0x10000x0701"yellowfin""Symbios|83C885 gigabit ethernet"
0x10000x0702"yellowfin""Symbios|Yellowfin G-NIC gigabit ethernet"
0x10000x0901"unknown""Symbios|61C102"

分析
这个样例是由命令

CODE:

diff -u old/modules/pcitable new/modules/pcitable

创建的。只是最好是用命令diff -Naur来取代diff -u。
它改动了两个文件,new/modules/pcitable和new/usr/share/kudzu/pcitable。
第一个补丁头包括两个块,分别添加了两行和一行。

这个是參考了这篇文http://www.cpqlinux.com/patch.html来总结翻译。因为刚刚接触这些东西,非常多地方可能翻译的不恰当,尤其是一些术语,如有发现问题,请给我留言说明,以便我来改正,谢谢。

我也来说两句 查看所有评论 相关评论

  • superuser (2007-2-13 21:12:26)

    Patching (very) Mini Howto
    Introduction

    This very short document is a slightly lengthened version of an email I wrote in 2003 on the subject of patches, I‘ve put it here in case it could be useful to anyone else.
    The Howto

    cd into the directory containing the sources you want to patch:

    CODE:

    $ cd madwifiThen you need to pipe the patch file into the program ‘patch‘, like this:

    CODE:

    $ cat /path/to/patch/patch.diff | patch -p1The processs for applying gzipped or bzipped patches is almost identical, only you use a modified version of ‘cat‘ which can handle the compression thats been used e.g:

    CODE:

    $ bzcat /path/to/patch/patch.bz2 | patch -p1for bzips, or

    CODE:

    $ zcat /path/to/patch/patch.gz2 | patch -p1for the (more common) gzips.

    Another way which might interest some people (which I‘ve just descovered) is to do things the other way around, in this way you can do it without running cat:

    CODE:

    $ patch -p1 < patchI‘m not exactly sure how to do this with zipped patches just yet however, my experiments would lead me to belive that its more complex than most of what‘s above.

    The option -p1 tells the patch program to remove 1 layer of all the filenames from the input, you do this because normally the person who made the patch is one directory closer to / than you. The best way to explain this is too look at the content of a patch (this is part of the wireless extensions patch):

    CODE:

    diff -u -p linux/include/linux/wireless.15.h linux/include/linux/wireless.h
    --- linux/include/linux/wireless.15.h   Fri Jan 10 16:55:07 2003
    +++ linux/include/linux/wireless.h  Wed Apr  2 16:33:31 2003
    The lines mention "linux/include/[...]", now if you have more than one set of kernel sources on your system, then the one you want to patch will not necessarily be in as directory called ‘linux‘, the -p1 option would strip the linux from the filename and just leave:

    CODE:

    diff -u -p include/linux/wireless.15.h include/linux/wireless.h
    --- include/linux/wireless.15.h   Fri Jan 10 16:55:07 2003
    +++ include/linux/wireless.h  Wed Apr  2 16:33:31 2003
    From the above discussion, it should be fairly easy to see that patch strips from the left hand side, and removes n slashes. Where n is the number the ‘p‘ option.

    There are a couple of other things which I thinks its handy to know about patch, first is that not all patches will go on ‘cleanly‘, sometimes you will get messages like ‘Hunk suceeded at offset 32‘, this means that that part of the patch applied, but not in the exact same place as the original author intended. This happens all the time with the madwifi driver from cvs.

    Second is the -R swich for ‘patch‘, this:

    CODE:

    $ cat /path/to/patch/patch.diff | patch -p1 -Rwould remove the patch from your current directory tree.
    And finally

    One last thing to remember: I am no expert, and some of this may be a bit wrong, missing something or whatever. Drop me a line if it is.

时间: 2024-10-24 16:56:15

使用和制作patch文件的相关文章

linux 制作iso文件

1 概述 为了日常工作方便,我们可以自己制作iso文件,方便后期的使用 2 操作 2.1.cp直接制作 格式如下 cp  光盘路径  新生成的iso文件路径 例子 cp /dev/sr0  ./tt1/CentOS6.iso 这样的方式相当于是刻录磁盘,生成的文件CentOS6.iso 可以做启动盘 2.2 借助脚本mkdvdiso.sh来制作 以下是mkdvdiso.sh这个脚本下载路径.这个脚本只能是centOS4,5,6,三个版本可以制作 https://wiki.centos.org/T

arcgis 3种方法快速制作tpk文件(转)

arcgis 3种方法快速制作tpk文件(转) 作者:www.cnblogs.com  来源:www.cnblogs.com  发布日期:2015-03-22 来自:http://blog.csdn.net/arcgis_mobile/article/details/8048549 tpk是ArcGIS10.1推出的一种新的数据文件类型,主要是用于将切片文件打包形成离线地图包,tpk可以在ArcGIS Runtime或者ArcGIS for Android/iOS中作为切片底图被加载,有多种制作

Cocos2d3.0 制作PList文件

auto root = Dictionary::create(); auto string = String::create("string element value"); root->setObject(string, "string element key"); auto array = Array::create(); auto dictInArray = Dictionary::create(); dictInArray->setObject(

制作BibTex文件

上一篇日志中讲到了在LaTeX中使用BibTex管理参考文献,这篇日志具体总结下如何制作BibTex文件. 制作BibTex文件,主要有以下几种方法: 手工制作: 直接从期刊数据库中下载: 借助Google Scholar: 从文献管理工具中导出(本文涉及NoteExpress.EndNote.Mendeley). 前三种很简单,对于第四种方法,尤其是NoteExpress和EndNote导出时遇到了一个问题,这也是耗费我较长时间的原因所在,不过经过我的广泛收集资料及辛苦分析,终于搞定. 废话不

VS2010编译LLVM(制作Lib文件)

 VS2010编译LLVM(制作Lib文件) 搬运自我的百度空间 这里编译一个常用由常用LLVM的库组成的Lib文件,提高引用LLVM的程序的编译速度. 相比codeblocks简单一些.仍然使用Cmake这个工具.如果没有把python加入环境变量,把python26.exepython26.dll python26.zip拷贝到(源文件目录)\utils\llvm-build下(python 2.X应该都可以) 设置好source code path 和输出的VS工程的路径在wheret

diff和patch的使用、patch文件的格式解说

为了弄懂 patch中的 p0   p1    和.orig文件是啥,找到了这篇文章! 来源:http://www.cnblogs.com/super119/archive/2010/12/18/1909941.html diff和patch的使用.patch文件的格式解说 diff diff是生成源码补丁的必备工具.其命令格式为: diff [命令行选项] 原始文件 新文件 常用命令行选项如下: -r 递归处理目录 -u 输出统一格式(unified format) -N patch里包含新文

如何制作iso文件

UltraISO 9.6.2.3059中文完美破解安装版 http://www.upantool.com/qidong/2011/UltraISO_v9.5.0.2800.html 软碟通v9.6.2.3059单文件中文绿色版(32+64位) http://www.upantool.com/qidong/2011/UltraISO_V9.3.6.2750.html      iso是一种文件的格式,这种格式用来保存文件也是一种比较好的方法,因为我们常用的保存文件的方式都是通过压缩软件来保存,而用

python代码制作configure文件

在lua中,一直用lua作为config文件,或承载数据的文件 - 好处是lua本身就很好阅读,然后无需额外写解析的代码,还支持在configure文件中读环境变量,条件判断等. 在lua中通过loadfile, setfenv实现) python: cat config.py bar = 10 foo=100 cat python_as_config.py: ns = {} execfile('config.py', ns) print "\n".join(sorted(dir(ns

如何制作chm文件

本文介绍如何从一个包中的docs文档生成一个chm文档. 1,准备软件Easy CHM 这个网上有下载,下载后安装,至于怎么使用,等下再介绍.安装之后如下图. 2,准备文件 比如我这里下载了一个cxf的jar包,具体下载到官网,当然你们用得着这个包 解压后如图 我们打开其中的index.html如图 现在我们要制作chm文档了. 3,制作chm文件 打开软件,点击新建: 在导入文件夹中的工程目录选择我们刚才解压出来的文件,看我的文件,其实就是index.html所在的文件夹. 点击确定之后就开始