现在的位置: 首页 > 综合 > 正文

使用和制作patch文件

2013年05月28日 ⁄ 综合 ⁄ 共 5519字 ⁄ 字号 评论关闭

使用和制作patch文件

字体: | 打印

原文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. 

抱歉!评论已关闭.