使用和制作patch文件

使用和制作patch文件

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

使用和制作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. 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118051.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 波特尔暗空分类法_老暗锁打不开了怎么办

    波特尔暗空分类法_老暗锁打不开了怎么办传说中的暗之连锁被人们称为 Dark。Dark 是人类内心的黑暗的产物,古今中外的勇者们都试图打倒它。经过研究,你发现 Dark 呈现无向图的结构,图中有 N 个节点和两类边,一类边被称为主要边,而另一类被称为附加边。Dark 有 N–1 条主要边,并且 Dark 的任意两个节点之间都存在一条只由主要边构成的路径。另外,Dark 还有 M 条附加边。你的任务是把 Dark 斩为不连通的两部分。一开始 Dark 的附加边都处于无敌状态,你只能选择一条主要边切断。一旦你切断了一条主要边,Dark

    2022年8月9日
    3
  • 教育游戏常见开发工具(转)[通俗易懂]

    教育游戏常见开发工具(转)[通俗易懂]   就开发工具而言,教育游戏软件与其它游戏软件的开发工具没有什么本质的区别。目前用于游戏开发的工具主要有这样几种:a)VisualStudio组件Visua1C++系列     它被认为是当今最强大的游戏软件开发工具,用它开发的游戏数量很多,代表作有:暴雪娱乐的“Diabl。暗黑破坏神11”、“魔兽争霸”、“星际争霸”;其他公司产品:“命令与征服”、“FIFA”等大家熟悉的大型游戏。    

    2022年6月2日
    41
  • minipcie转nvme,msata转ngff sata「建议收藏」

    minipcie转nvme,msata转ngff sata「建议收藏」现如今的电脑主板,m.2/ngff接口相当普遍。具有minipcie接口的主板大概只有工控主板和老款的主板的了。并不代表minipcie就会别淘汰了。对于消费用户,minipcie接口就是装个无线网卡。但在某些情况下,并不需要这无线网卡功能,这一接口就作他用了,比如扩展nvme固态盘或者傲腾呢?!nvme固态盘/傲腾是m.2/ngff接口的,接口不一样,不能直接安装。但是可以通过接口转接板将minipcie接口转换成m.2/ngff接口来安装nvme固态盘,NICE!常见的nvme固态盘尺寸

    2022年9月7日
    0
  • 数组的splice方法和slice方法_splice方法返回值

    数组的splice方法和slice方法_splice方法返回值功能强大的splice方法数组中最强大的方法splice(),可以对数组进行添加、删除、替换操作删除arr=[‘0赵’,‘1钱’,‘2孙’,‘3李’,‘4周’,‘5吴’]arr.splice(index,num)第一个参数表示开始删除的索引位置,num表示删除的个数如arr.splice(1,2)返回的结果为:arr=[‘0赵’,‘3李’,‘4周’,‘5吴’]添加arr=[‘0赵’,‘1钱’,‘2孙’,‘5吴’]arr.splice(index,0,‘x’,‘y’)第一个参数表示

    2022年9月25日
    1
  • 安装mysql8.0.11版本,并使用mybatis进行连接mysql遇到的问题

    安装mysql8.0.11版本,并使用mybatis进行连接mysql遇到的问题

    2021年9月26日
    53
  • rabbitmq 和 kafka使用场景[通俗易懂]

    rabbitmq 和 kafka使用场景[通俗易懂] rabbitMQ     1.RabbitMQ的消息应当尽可能的小,并且只用来处理实时且要高可靠性的消息。2.消费者和生产者的能力尽量对等,否则消息堆积会严重影响RabbitMQ的性能。3.集群部署,使用热备,保证消息的可靠性。 kafka1.应当有一个非常好的运维监控系统,不单单要监控Kafka本身,还要监控Zookeeper。(kafka强烈的依赖于zookeepe…

    2022年10月14日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号