您的位置:首页 > 运维架构 > Linux

linux -- patch补丁文件以及相关内容

2015-11-23 19:27 295 查看
本文的目的是向Linux新手介绍一种无价的资源,Larry Wall的patch程序。patch是用来查找文件之间差异的GNU diff命令的一个接口;diff有很多选项,但是该命令最常用的用途是用来生成一个文件,该文件中列出了内容发生改变的行,显示两个原始文件、修改过的 行以及由于内容没有变化而忽略掉的行。

patch典型地用于把一个目录下的源代码文件更新到新的版本,从而就避免了下载整个新的源代码档案的必要。

diff 和 patch 是相辅相成的, diff命令产生patch文件, 由patch命令解析执行。

先介绍diff

diff的功能就是用来比较两个文件的不同,然后记录下来,也就是所谓的diff补丁。

格式 : diff[参数][文件1或目录1][文件2或目录2]

参数 : 这里只提几个能和patch一起使用的

-a或--text  diff预设只会逐行比较文本文件。

-N或--new-file  在比较目录时,若文件A仅出现在某个目录中,预设会显示:Only in目录:文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。

-r或--recursive  比较子目录中的文件。

-u,-U或--unified=  以合并的方式来显示文件内容的不同。

-c  显示全部内文,并标出不同之处。

一般就使用 -Nur

产生patch文件

命令diff A B >C ,一般A是原始文件,B是修改后的文件,C称为A的补丁文件。

不加任何参数生成的diff文件格式是一种简单的格式,这种格式只标出了不一样的行数和内容。我们需要一种更详细的格式,可以标识出不同之处的上下文环境,这样更有利于提高patch命令的识别能力。这个时候可以用-c开关。

patch 命令用于打补丁,补丁文件是使用diff产生的

patch就是利用diff制作的补丁来实现源文件(夹)和目的文件(夹)的转换。这样说就意味着你可以有源文件(夹)――>目的文件(夹),也可以目的文件(夹)――>源文件(夹)。

patch 命令语法

patch [ -b [ -B Prefix ] ] [ -f ] [ -l ] [ -N ] [ -R ] [ -s ] [ -v ] [ -c | -e | -n ] [ -d Directory ] [ -D Define ] [ -F Number ] [ -i PatchFile ] [ -o OutFile ] [ -p Number ] [ -r RejectFile ] [ -x Number ] [ File ]

-p0 选项要从当前目录查找目的文件(夹)

-p1 选项要忽略掉第一层目录,从当前目录开始查找。

以此类推

-E 选项说明如果发现了空文件,那么就删除它

-R 选项说明在补丁文件中的“新”文件和“旧”文件现在要调换过来了(实际上就是给新版本打补丁,让它变成老版本)

关于版本控制, 还有一个非常常用的工具 ---- git

不过在git中,我们没有必要直接使用diff和patch来做补丁,这样做既危险又麻烦。

git提供了两种简单的patch方案。一是用git diff生成的标准patch,二是git format-patch生成的Git专用Patch。

这里就不介绍git的用法,网上有大量的资料。我的博客里也有相关介绍。

一 用git diff生成的标准patch

git diff产生标准的diff文件,可以用来产生patch 文件。

例如在master 分支有 a.txt文件

git checkout -b p1 /// 产生一个新分支p1

echo 'abcd' >> a.txt ///

git commit -am "patch p1" /// 产生变化并提交

git diff master > patch /// 将当前分支与master分支比较,并产生patch文件

git checkout master

git checkout -b p2 /// 产生一个与master相同的分支p2

git apply patch /// 运用patch 文件

git diff p1 /// 此时p1和p2分支相同了。

这里注意, 

1. 用 git diff [分支名,默认是master] > patch 产生补丁(patch)文件。

用 git apply <补丁文件>, 来打补丁。

2. 在那个目录做补丁文件, 就在那个目录应用补丁文件。

二 git format-patch生成的git专用补丁

在对应分支中

git format-patch -M master /// -M 表示要比较的分支

会产生一个 .patch文件

不仅有diff的信息,还有提交者,时间等等,仔细一看你会发现,这是个E-mail的文件,你可以直接发送它!这种patch,我们要用git am来应用。

git am xxxx.patch

(1)兼容性:很明显,git diff生成的Patch兼容性强。如果你在修改的代码的官方版本库不是Git管理的版本库,那么你必须使用git diff生成的patch才能让你的代码被项目的维护人接受。

(2)除错功能:对于git diff生成的patch,你可以用git apply --check 查看补丁是否能够干净顺利地应用到当前分支中;如果git format-patch 生成的补丁不能打到当前分支,git am会给出提示,并协助你完成打补丁工作,你也可以使用git am -3进行三方合并,详细的做法可以参考git手册或者《Progit》。从这一点上看,两者除错功能都很强。

(3)版本库信息:由于git format-patch生成的补丁中含有这个补丁开发者的名字,因此在应用补丁时,这个名字会被记录进版本库,显然,这样做是恰当的。因此,目前使用Git的开源社区往往建议大家使用format-patch生成补丁。

目前先总结这么多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: