最近使用diff和patch,前面已经转贴了一篇很好的文章,但是在使用的时候,还有一些细节问题,记录下来。
第一个
--- old/modules/pcitable Mon Sep 27 11:03:56 1999
+++ new/modules/pcitable Tue Dec 19 20:05:41 2000
如果使用参数-p0,那就表示从当前目录找一个叫做old的文件夹,在它下面寻找modules下的pcitable文件来执行patch操作。
如果使用参数-p1,那就表示忽略第一层目录(即不管old),从当前目录寻找modules的文件夹,在它下面找pcitable。这样的前提是当前目录必须为modules所在的目录。而diff补丁文件则可以在任意位置,只要指明了diff补丁文件的路径就可以了。当然,可以用相对路径,也可以用绝对路径。不过我一般习惯用相对路径。
那个p0与p1应该只是针对此时需要打补丁的文件而言,目录的忽略也是如此。
第二个
patch文件的结构
补丁头
补丁头是分别由---/+++开头的两行,用来表示要打补丁的文件。---开头表示旧文件,+++开头表示新文件。
一个补丁文件中的多个补丁
一个补丁文件中可能包含以---/+++开头的很多节,每一节用来打一个补丁。所以在一个补丁文件中可以包含好多个补丁。
块
块是补丁中要修改的地方。它通常由一部分不用修改的东西开始和结束。他们只是用来表示要修改的位置。他们通常以@@开始,结束于另一个块的开始或者一个新的补丁头。
块的缩进
块会缩进一列,而这一列是用来表示这一行是要增加还是要删除的。
块的第一列
+号表示这一行是要加上的。
-号表示这一行是要删除的。
没有加号也没有减号表示这里只是引用的而不需要修改。
************************************************************
没有提到的是 @@ -1,3 +1,4 @@这个的意思,后来找了好一会,才找到答案,
网址http://zhuxixi327.javaeye.com/blog/713639
http://makediff.blog.163.com/blog/static/168821357201091143715997/
-1,3表示原文件的第1行到第3行间;
+1,9表示新文件的第1行到第9行
第3行和第9行,这两个行数不同,表示从源文件到新文件增加了几行。
带加号(+)的行,表示增加的,不带号的,表示原来就有的;
第三
再贴一个示例
在此仅举一个简单的例子来说明如何用diff/patch工具维护源码升级。
假设program-1.0目录中为老版,现开发完成的新版位于program-2.0目录中,将两个目录置于同一父目录下,然后在该父目录上执行:
diff -Nur program-1.0 program-2.0 >program-2.0.patch |
将生成一个program-2.0.patch的补丁文件,发布该补丁文件(当然可以先压缩成bzip2格式)。
假设拿到的是program-2.0.patch.bz2文件,则在program-1.0目录同级执行:
bzcat program-2.0.patch.bz2 | patch -p0 |