patch,diff相关知识整理

来源:互联网 发布:淘宝最近怎么了 编辑:程序博客网 时间:2024/05/18 20:05

    • 一两个命令字
    • 二命令格式
    • 三补丁文件格式说明
    • summary

一.两个命令字:

  • diff:用于生成补丁文件
  • patch:利用生成的补丁文件打补丁将旧文件(项目)变成目标文件(项目)

二.命令格式:

  1. diff [命令行选项] 原始文件 新文件
    几个常用的选项说明:

    • -r recursively 递归处理各级目录     
    • -u output NUM (default 3) lines of unified context 显示标准行数(默认3行)的格式化内容。简单说就是在块的开始和结束区显示3行原文内容。
    • -N treat absent files as empty  将旧文档中不存在的文件当做空文件处理
    • -p:显示变化所在的C函数

    diff的内容默认输出到stdout上,所以需要把它重定向到一个文件中才能保存,如下:

     diff -uN test0 test1 > test1.patch  

    如果是文件夹就加个r 常用-rNu就行

  2. patch [命令行选项] [待打补丁的文件或文档 [补丁文件]]
    如果不指明补丁文件,那patch程序默认从stdin读入,所以用了输入重定向指明补丁。
    通常只用如下格式就可

    patch -pnum <patchfile

    选项说明:    

    • -pnum:patch level num是数字 打补丁时在寻找文件时忽略的(prefix)前缀目录层次

      eg: 文件的绝对位置在 ./u/howard/src/blurfl/blurfl.c

      如果设置为 -p0 则从当前目录搜索文件,如果设置成 -p1 则忽略顶层目录,从下一级 搜索文件

      u/howard/src/blurfl/blurfl.c

      -p4 则忽略前三层目录,搜索下面的路径文件

      blurfl/blurfl.c
    • -R : reverse ,反转补丁,实质就是将新文件或文档恢复成以前的版本。

    • -E:如果发现了空文件,那么就删除它,
      恢复旧版本eg:

      patch –RE –p0 < file.patch

    如果patch失败,patch会把成功的patch行给patch上,同时(无条件)生成备份文件和一个.rej文件。.rej文件里是没有成功提交的patch行,需要手工patch上去。

三.补丁文件格式说明

补丁文件 由多个或一个{补丁头+多个补丁块} 构成 ,如下,灰底色为补丁头,其它为补丁块

  • 补丁头
    组成方式:补丁命令 + 旧文件信息(—表示)+ 新文件信息(+++表示) 如下:

    diff -urN u-boot-2010.09/arch/arm/cpu/arm920t/s3c24x0/timer.c u-boot-2010.09_jz2440/arch/arm/cpu/arm920t/s3c24x0/timer.c
  • 补丁块
    说明文件中要修改的信息,通常由 @@ 开始指定,结束于另一个补丁头或新补丁块的开始。
    一般以三行原文做为块的开始和结束,(这三行包括空行也算在内)这就是打补丁时用-u指定的格式,
    示例如下

    @@ -151,10 +151,22 @@ void CBinmap::setDate(int x,int y,__u8 gray) {     dataptr[x+y*width]=gray; }+void CBinmap::setDate(CPOINT zb, __u8 gray){+    setDate(zb.x,zb.y,gray);+}+ void CBinmap::setDate(__u8 gray) {     dataptr[currentpoint] = gray; }+void CBinmap::drawPoint(QVector<CPOINT> &zb, uchar color){+    foreach (CPOINT tmpzb, zb) {+        setDate(tmpzb,color);+        setRectBorder(tmpzb,color,1);+        setRectBorder(tmpzb,color,2);+    }+}+ //************************************ // Method:    binary // FullName:  CBinmap::binary@@ -974,7 +986,7 @@ void CBinmap::thinning(void)...
    • @@ 开始标识 ,后面也可有修改的函数名;
    • -151,10 表示在旧文中的第151行开始,总共10行内容;
    • -151,22 新文件以第151行为开始,变成了22行内容;
    • 块中的内容说明:
      • +:表示要增加的内容
      • -:表示要删减的内容
      • 无符号:表示不变的原文

summary:

  • 单文件
    生成补丁 :

    diff –uN old_file new_file >file.patch

    打补丁:

    patch –p0 < file.patch

    恢复旧样:

    patch –RE –p0 < file.patch
  • 多文件

    diff –uNr old-doc new-doc >doc.patchpatch –p1 < doc.patchpatch –R –p1
原创粉丝点击