Diff and Patch

这两个程序是用于生成补丁和打补丁用的. 他们是广泛的使用于各种的
版本控制系统中, 一般的软件发布也经常使用他们. 因此, 深入了解他们是非常
重要的. 本文只是一个入门级的导引. 详细说明请参照info.

    diff比较两个文本文件, 找到他们的不同之处, 通常是连续的数行不同
, 存在很多的这种东西, 每一个连续的几行被称为一个chunk.

    我们看一看下面的例子.
    a.txt
aaa
bbb
ccc

    b.txt
    ccc
    bbb
aaa

    diff from-file to-file
    diff a b > p
    cat p
    1,2d0
    < aaa
    < bbb
    3a2,3
    > bbb
    > aaa

    patch a < p
    cat a
    ccc
bbb
aaa

    这里的p是一种diff格式, 很古老现在也基本不用了.
    GNU diff提供了两种显示上下文的diff格式. 一种叫作
context format, 另一种叫作unified format. 后一种只有
GNU系统支持, 在GPL的软件中被广泛的使用着, 我也比较喜欢这种
格式.
————————————————–
一. context format

diff -c a b > p
cat p
*** a Fri Sep 17 10:14:46 1999
— b Fri Sep 17 10:08:53 1999
***************
*** 1,3 ****
文件a的第一到第三行有不同
- aaa
- bbb
ccc
文件在这里分为两个部分
— 1,3 —-
文件b的第一到第三行有不同
ccc
+ bbb
+ aaa
这里只有一个chunk

注意: 在这两种context格式种记录了from和to的文件名. 因此
    patch < p
就可以打补丁了.
他的格式如下:
*** From-File From-File-Modification-Time
— To-File To-File-Modification-Time
以下列字符开头的有如下意义
! 这一部分有变化 在chunk的两个部分中会有对应的一些行用!标识,
当然, 这两部分中的行数可能不同.
+ 这一行插入第二个文件中
_ 这一行从第一个文件中删除

—————————————————
二. unified format

diff -u a b > p
cat p

— From-File From-File-Modification-Time
+++ To-File To-File-Modification-Time
— a Fri Sep 17 10:14:46 1999
+++ b Fri Sep 17 10:08:53 1999
一个chunk -1,3表示a的1到3行 +1,3表示b的1到3行
@@ -1,3 +1,3 @@
-aaa
-bbb
ccc
+bbb
+aaa
以’+'开头表示这一行被加入到第一个文件
以’-'开头表示这一行被从第一个文件中删除

打补丁 patch < p
————————————————-
diff的一些重要的参数:
    -b 忽略行尾的空白
    -w 忽略文件中仅仅是由空白造成的区别
    -B 忽略文件中的空行
    -i 忽略大小写的不同

    -p 对编程语言的特殊支持, 记录有变化的函数名

————————————————–
patch的一些重要的参数:
    -pn n是一个整数
    表示将补丁文件中文件名的路径部分去掉几个’/’
    当你不指定时, patch将只取出文件名,-p0 表示不修改
   
    如:
    ~/src—– a
|
    |- b

    diff src/a src/b > p
    cd ~
    patch -p0 < p 可以工作
    patch < p 提示找不到文件
    cd src
    patch < ../p 也可以工作

————————————————–   
注意:
    如果, 你自己发补丁时, 应该说明是-pnum的num.        

这里作了一个简要的说明, 近一步的了解, 可以看info和man.


这里作了一个简要的说明, 近一步的了解, 可以看info和man.


评论

该日志第一篇评论

发表评论

评论也有版权!