注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

补丁命令使用  

2012-05-31 12:36:16|  分类: LINUX编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

补丁命令使用

1、补丁命令简介

用到的两个命令是diff和patch。

diff

diff可以比较两个东西,并可同时记录下二者的区别。制作补丁时的一般用法和常见选项为:

diff 【选项】 源文件(夹) 目的文件(夹)

-r

递归。设置后diff会将两个不同版本源代码目录中的所有对应文件全部都进行一次比较,包括子目录文件。

-N

选项确保补丁文件将正确地处理已经创建或删除文件的情况。

-u

输出每个修改前后的3行,也可以用-u5等指定输出更多上下文。

-E, -b, -w, -B, --strip-trailing-cr

忽略各种空白,可参见文档,按需选用。

patch

patch的作用则是将diff记录的结果(即补丁)应用到相应文件(夹)上。最常见的用法为:

patch -pNUM <patchfile>

-p Num

忽略几层文件夹,随后详解。

-E

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

-R

取消打过的补丁。

为了解释 -p 参数,需要看看如下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。

2、示例

在当前目录下,创建difTest文件夹,进入,再创建两个文件夹,project0,project1,在project0中创建display.c、main.c文件,在project1文件夹中创建read.c,main.c,然后退回到difTest文件中:

Cd   ..(注意二者间有一个空格)

[fjf@localhost difTest]$ diff  -uNr project0 project1 > test.patch

[fjf@localhost difTest]$ ls

project0  project1  test.patch

然后我们看一下这个文件到底生成了什么:

[fjf@localhost difTest]$ cat test.patch

diff -uNr project0/display.c project1/display.c

--- project0/display.c  2011-12-22 08:25:34.000000000 -0500

+++ project1/display.c  1969-12-31 19:00:00.000000000 -0500

@@ -1,6 +0,0 @@

-#include <read.h>

-

-void Display()

-{

-  printf("displya cur data----");

-}

diff -uNr project0/main.c project1/main.c

--- project0/main.c     2011-12-22 08:24:53.000000000 -0500

+++ project1/main.c     2011-12-22 08:05:57.000000000 -0500

@@ -1,8 +1,5 @@

-#include <stdio.h>

-#include <stdlib.h>

-#include<time.h>

-typedef struct __Display

+#include<stdio.h>

+int main()

 {

-   int d;

-    char f;

-};

+       return 0;

+}

diff -uNr project0/read.c project1/read.c

--- project0/read.c     1969-12-31 19:00:00.000000000 -0500

+++ project1/read.c     2011-12-22 08:23:45.000000000 -0500

@@ -0,0 +1,6 @@

+string read(char *bytedata)

+{

+   file h = null;

+     read(h,bytedata);

+return bytedata;

+}

怎么样?头大了,看看下面的说明吧。

 

3、patch文件构成说明

针对上面的例子,做一下解释:

--- project0/display.c  2011-12-22 08:25:34.000000000 -0500

+++ project1/display.c  1969-12-31 19:00:00.000000000 -0500

@@ -1,6 +0,0 @@

-#include <read.h>

-

-void Display()

-{

-  printf("displya cur data----");

-}

补丁头

补丁头是分别由---/+++开头的两行,用来表示要打补丁的文件。---开头表示旧文件,+++开头表示新文件。

一个补丁文件中的多个补丁

一个补丁文件中可能包含以---/+++开头的很多节,每一节用来打一个补丁。所以在一个补丁文件中可以包含好多个补丁。

块是补丁中要修改的地方。它通常由一部分不用修改的东西开始和结束。他们只是用来表示要修改的位置。他们通常以@@开始,结束于另一个块的开始或者一个新的补丁头。

块的缩进

块会缩进一列,而这一列是用来表示这一行是要增加还是要删除的。

块的第一列

+号表示这一行是要加上的。-号表示这一行是要删除的。没有加号也没有减号表示这里只是引用的而不需要修改。

4、实际操作

看明白了后进行一下实战:

[fjf@localhost difTest]$ cd project0

[fjf@localhost project0]$ ls

display.c  display.c~  main.c  main.c~

[fjf@localhost project0]$ patch p1 < ../test.patch

patch: **** Can't find file p1 : No such file or directory

[fjf@localhost project0]$ patch -p1 < ../test.patch

patching file display.c

patching file main.c

patching file read.c

这时候你打开你的project0你会发现,他与project1的内容一样了。是不是和内核打补丁的情况一样?

如果你觉得你打错了,可以用上面介绍的回退的命令:

[fjf@localhost project0]$ patch -R  -p1 < ../test.patch

patching file display.c

patching file main.c

patching file read.c

[fjf@localhost project0]$ ls

display.c  display.c~  main.c  main.c

这时候儿你会发现你原来的程序又出现了

针对project1亦也是如此:

[fjf@localhost project0]$ ls

display.c  display.c~  main.c  main.c~

[fjf@localhost project0]$ cd ..

[fjf@localhost difTest]$ cd project1

[fjf@localhost project1]$ ls

main.c  main.c~  read.c  read.c~

[fjf@localhost project1]$ patch -R  -p1 < ../test.patch

patching file display.c

patching file main.c

patching file read.c

[fjf@localhost project1]$ ls

display.c  main.c  main.c~  read.c~

[fjf@localhost project1]$

5、注意

在SVN和GIT中,你可以使用可以直接用svn diff或git diff生成补丁文件。

另外需要注意的是,由于应用补丁时的目标代码和生成补丁时的代码未必相同,打补丁操作可能失败。补丁失败的文件会以.rej结尾,下面命令可以找出所有rej文件:

find . -name '*.rej'

实践是检验真理的唯一标准啊。

 

 

  评论这张
 
阅读(614)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017