diff和patch十分钟指南

来源:互联网 发布:淘宝子账号有风险吗 编辑:程序博客网 时间:2024/04/29 15:06
情景一:你正尝试从代码编译一个软件包,发现有人已经对代码进行了小小的修改以便在你的系统上编译。他们通过补丁的方式发布自己的成果,但是你却不知道该如何使用它。答案是你使用一个叫做patch(很贴切)的命令行工具将补丁应用到原始代码上。 

情景二:你下载了一个开源软件包的代码,花了一个小时左右稍作修改,成功的让它在你的系统上编译通过。你想把自己的成果分享给其他程序员,或者给软件包的作者。现在你就需要创建自己的补丁,你需要的工具是diff。

这是一份diff和patch的快速指南,通过讲解它们最常见的用法来帮你解决上面问题。它告诉你的东西足够让你立刻开始使用。之后,你可以在闲暇的时候用manpage来学习diff和patch的前前后后。我总是乐意听到你们的问题和意见。用联系表单跟我取得联系。 

用patch命令应用补丁 

要对单个文件应用补丁,进入需要打补丁的文件所在的目录并调用patch命令: 

patch < foo.patch 

这些命令假定补丁是以统一格式分发的,这种格式指明了补丁要应用到的文件。如果不是,你可以在命令行里指定文件: 

patch foo.txt < bar.patch 

应用补丁到整个目录(这种情况也许更常见)也是类似的,但是你必须注意设置p级别。就是说,在补丁文件里,需要打补丁的文件在你电脑上的路径名跟在创建补丁的电脑上可能不同。p级别告诉patch命令忽略掉路径名的几个部分以正确的识别文件。通常p级别为1就够了,所以你使用: 

patch -p1 < bar.patch 

运行该命令之前,你应该进入源代码目录的顶层目录。如果补丁级别1不能正确识别任何需要打补丁的文件,检查补丁文件里的文件名。如果你看到这样一个文件名: 

/users/stephen/package/src/net/http.c 

而你当前正工作在一个包含net/http.c的目录,使用: 

patch -p5 < bar.patch 

总的来说,对于从路径最开始删除的每个路径分隔符(斜线字符)加一,直到剩下的部分存在于你的工作目录中。最后得到的就是p级别。 

要删除补丁,用-R参数,例如: 

patch -p5 -R bar.patch 

使用diff创建补丁 

不论是对于单个文件还是整个源码目录,使用diff都很简单。为单个文件创建补丁,用下面形式: 

diff -u original.c new.c > original.patch 

为整个源码树创建补丁,复制一份源码树: 

cp -R original new 

在目录new/里进行必要的修改,然后用下面的命令创建补丁: 

diff -rupN original/ new/ > original.patch 

这就是diff和patch入门需要的所有知识。要获得更多的信息用: 

man diff 

man patch


 浅谈patch 

对修改的文件比较差异,并创建一个补丁文件(patch),其实很简单,下面就对patch做简单的介绍:

一、创建补丁文件

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

对于目录层数的一些限制,在创建patch的时候文件夹的层数应当是一样的,比如
--- old/lib/TWiki Aug 17 11:03:56 2008
+++ new/lib/TWiki Aug 19 20:05:41 2008
这样是可以的。而
--- old/other/lib/TWiki Aug 17 11:03:56 2008
+++ new/lib/TWiki Aug 19 20:05:41 2008
这样做可能会出问题。

二、如何使用patch
1,对于一个patch文件,有两种常用使用方法:

cat new-patch | patch -p02.

patch -p0 < new-patch

2,patch命令里面的层数(-p0?-p1?)
参数-p来指定从第几层开始比较。比如有一个patch文件的补丁头是这样的:
--- old/lib/TWiki Aug 17 11:03:56 2008
+++ new/lib/TWiki Aug 19 20:05:41 2008
如果使用参数-p0,就表示从当前目录,找一个叫作new的目录,在它下面找一个叫lib的目录,再在它下面找一个叫TWiki的目录。
如果使用参数-p1,就表示忽略第一层,从当前目录找一个叫lib的目录,在它下面找一个叫TWiki的目录。这样会忽略掉补丁头提到的new目录。
依此类推。

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


0 0
原创粉丝点击