over 2 years ago
Diff 创建软件补丁,用patch 打补丁

diff 是生成源码补丁的必备工具。其命令格式为:
diff [命令行选项] 原始文件新文件
常用命令行选项如下:
-r 递归处理目录
-u 输出统一格式(unified format)
-N patch 里包含新文件
-a patch 里可以包含二进制文件
它的输出在stdout 上,所以你可能需要把它重定向到一个文件。输出格式保存了上下文(缺省是上下各三行,最少需要两行),这样,patch 的时候可以允许行号不精确匹配的情况出现。另外,在patch 文件的开头明确地用---和+++标示出原始文件和当前文件,也方便阅读。

通常,我们需要对整个软件包做修改,并生成一个patch 文件,下面是典型的操作过程。

tar xzvf software.tar.gz # 展开原始软件包,其目录为software
cp _a software software-orig # 做个修改前的备份
cd software
[修改,测试……]
cd ..
diff -ruNa software-orig software > software-my.patch

现在我们就可以保存software-my.patch 做为这次修改的结果,至于原始软件包,可以不必保存。等到下次需要再修改的时候,可以用patch 命令把这个补丁打进原始包,再继续工作。比如是在linux kernel 上做的工作,就不必每次保存几十兆修改后的源码了。这是好处之一,好处之二是维护方便,由于unified patch格式有一定的模糊匹配能力,能减少原软件包升级带来的维护工作量。
patch
patch 程序根据补丁(patch)文件修改一个文件。补丁文件通常是使用diff 程序建立的一个列表,这个列表包含如何修改原始文件的一些指令。由于节省时间和空间,Patch 经常用于源代码的修补。
可以想象一个有1MB 的程序包,这个程序包的下一个版本仅仅改变了前面一个版本的两个文件的内容,这个新版本可以完全以一个1MB 的新版本进行发布或者以一个仅仅有1KB 的补丁文件进行发布。这个补丁文件可以对第一个版本的进行更新,更新后的版本就和第二个版本完全一致了。因此,如果已经下载了第一个版本,那么为了下一个版本而进行的大数据量下载工作就可以有效地避免。
常用命令行选项:
patch [命令行选项] [待patch 的文件[patch]]
-pn patch level(n 是数字) 
-b[后缀] 生成备份,缺省是.orig,为了说明什么是patch level,这里看一个patch 文件的头标记。
diff -ruNa xc.orig/config/cf/Imake.cf xc.bsd/config/cf/Imake.cf
--- xc.orig/config/cf/Imake.cf Fri Jul 30 12:45:47 1999
+++ xc.new/config/cf/Imake.cf Fri Jan 21 13:48:44 2000
这个patch 如果直接应用,它会去找xc.orig/config/cf 目录下的Imake.cf 文件,假如你的源码树的根目录是缺省的xc 而不是xc.orig,除了mv xc xc.orig 之外,有无简单的方法应用此patch 呢?patch level 就是为此而设:patch 会把目标路径名砍去开头patch level 个节(由/分开的部分)。在本例中,可以用下述命令:
cd xc; patch -p1 
完成操作。注意,由于没有指定patch 文件,patch 程序默认从stdin 读入,所以用了输入重定向。又例如:
diff -r dir1 dir2 >patch20020523.patch

递归的比较目录dir1 与dir2 内,所有各文件之不同处,并将不同处记录到patch20020523.patch 文件中。
 patch -p1  
 -p1 选项代表patchfile 中文件名左边目录的层数,顶层目录在不同的机器上有所不同。要使用这个选项,就要把你的patch 放在要被打补丁的目录下,然后在这个目录中运行path -p1 。

http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html

← Fedora 20: Setting a static IP address Cacti Installation →
 
comments powered by Disqus