一.两个命令字:
- diff:用于生成补丁文件
- patch:利用生成的补丁文件打补丁将旧文件(项目)变成目标文件(项目)
二.命令格式:
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就行
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.patch patch –p1 < doc.patch patch –R –p1