工具篇:补丁工具diff 和 patch

Posted 旧年不在cd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工具篇:补丁工具diff 和 patch相关的知识,希望对你有一定的参考价值。

通过diff命令比较出新旧版本之间的差异,并以patch命令来将旧版本更新为新版本。或者从新版本通过打补丁回到旧版本。

一、diff的使用

  • 作用
    • 逐行比较两个文本文件,把文件的差异显示到标准输出。如果要指定要比较目录,那么diff命令会比较目录中相同文件名的文件,不会比较子目录。
  • 语法
diff [option] files
  • 选项列表
-<行数>  					指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。
-a或--text  					diff预设只会逐行比较文本文件。
-b或--ignore-space-change 	不检查空格字符的不同。
-B或--ignore-blank-lines  	不检查空白行。
-c  						显示全部内文,并标出不同之处。
-C<行数>--context<行数>  	与执行"-c-<行数>"指令相同。
-d或--minimal  				使用不同的演算法,以较小的单位来做比较。
-D<巨集名称>或ifdef<巨集名称>  此参数的输出格式可用于前置处理器巨集。
-e或--ed  					此参数的输出格式可用于ed的script文件。
-f或-forward-ed  			输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处。
-H或--speed-large-files  	比较大文件时,可加快速度。
-l<字符或字符串>--ignore-matching-lines<字符或字符串>  若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。
-i或--ignore-case  			不检查大小写的不同。
-l或--paginate  			将结果交由pr程序来分页。
-n或--rcs  				将比较结果以RCS的格式来显示。
-N或--new-file  			在比较目录时,若文件A仅出现在某个目录中,预设会显示:
Only in目录:文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。
-p  					若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。
-P或--unidirectional-new-file  与-N类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空白的文件做比较。
-q或--brief  			仅显示有无差异,不显示详细的信息。
-r或--recursive  		比较子目录中的文件。
-s或--report-identical-files  若没有发现任何差异,仍然显示信息。
-S<文件>--starting-file<文件>  在比较目录时,从指定的文件开始比较。
-t或--expand-tabs  		在输出时,将tab字符展开。
-T或--initial-tab  		在每行前面加上tab字符以便对齐。
-u,-U<列数>--unified=<列数>  以合并的方式来显示文件内容的不同。
-v或--version  			显示版本信息。
-w或--ignore-all-space  	忽略全部的空格字符。
-W<宽度>--width<宽度>  在使用-y参数时,指定栏宽。
-x<文件名或目录>--exclude<文件名或目录>  不比较选项中所指定的文件或目录。
-X<文件>--exclude-from<文件>  您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件。
-y或--side-by-side  		以并列的方式显示文件的异同之处。
--help  				显示帮助。
--left-column  			在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。
--suppress-common-lines  在使用-y参数时,仅显示不同之处。
  • 用diff生成补丁
diff -Naur test1.c test2.c > test.patch(补丁文件)

二、patch的使用

  • 作用
    • 利用生成的补丁文件给原文件打补丁
  • 语法
patch [option] < test.patch(补丁文件)
  • 选项列表
-b或--backup		备份每一个原始文件。
-B<备份字首字符串>--prefix=<备份字首字符串>  设置文件备份时,附加在文件名称前面的字首字符串,该字符串可以是路径名称。
-c或--context  把修补数据解译成关联性的差异。
-d<工作目录>--directory=<工作目录>  	设置工作目录。
-D<标示符号>--ifdef=<标示符号>  		用指定的符号把改变的地方标示出来。
-e或--ed  							把修补数据解译成ed指令可用的叙述文件。
-E或--remove-empty-files  			若修补过后输出的文件其内容是一片空白,则移除该文件。
-f或--force  						此参数的效果和指定"-t"参数类似,但会假设修补数据的版本为新 版本。
-F<监别列数>--fuzz<监别列数>  			设置监别列数的最大值。
-g<控制数值>--get=<控制数值>  			设置以RSC或SCCS控制修补作业。
-i<修补文件>--input=<修补文件>  		读取指定的修补文件。
-l或--ignore-whitespace  				忽略修补数据与输入数据的跳格,空格字符。
-n或--normal  							把修补数据解译成一般性的差异。
-N或--forward  							忽略修补的数据较原始文件的版本更旧,或该版本的修补数据已使 用过。
-o<输出文件>--output=<输出文件>  			设置输出文件的名称,修补过的文件会以该名称存放。
-p<剥离层级>--strip=<剥离层级>  			设置欲剥离几层路径名称。
-f<拒绝文件>--reject-file=<拒绝文件>  		设置保存拒绝修补相关信息的文件名称,预设的文件名称为.rej。
-R或--reverse  							假设修补数据是由新旧文件交换位置而产生。
-s或--quiet或--silent  					不显示指令执行过程,除非发生错误。
-t或--batch  							自动略过错误,不询问任何问题。
-T或--set-time  							此参数的效果和指定"-Z"参数类似,但以本地时间为主。
-u或--unified  							把修补数据解译成一致化的差异。
-v或--version  							显示版本信息。
-V<备份方式>--version-control=<备份方式>  用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这个字符串不仅可用"-z"参数变更,当使用"-V"参数指定不同备份方式时,也会产生不同字尾的备份字符串。
-Y<备份字首字符串>--basename-prefix=--<备份字首字符串>  设置文件备份时,附加在文件基本名称开头的字首字符串。
-z<备份字尾字符串>--suffix=<备份字尾字符串>  此参数的效果和指定"-B"参数类似,差别在于修补作业使用的路径与文件名若为src/linux/fs/super.c,加上"backup/"字符串后,文件super.c会备份于/src/linux/fs/backup目录里。
-Z或--set-utc  							把修补过的文件更改,存取时间设为UTC。
--backup-if-mismatch  					在修补数据不完全吻合,且没有刻意指定要备份文件时,才备份文件。
--binary  								以二进制模式读写数据,而不通过标准输出设备。
--help  								在线帮助。
--nobackup-if-mismatch  				在修补数据不完全吻合,且没有刻意指定要备份文件时,不要备份文件。
--verbose  								详细显示指令的执行过程。
  • 用patch打补丁
patch -bp0 < test.patch(补丁文件)
  • 撤销打的补丁
patch -Rp0 < test.patch(补丁文件)

以上是关于工具篇:补丁工具diff 和 patch的主要内容,如果未能解决你的问题,请参考以下文章

(打补丁 )patch

diff和patch应用于提取差异和打补丁

Linux下使用diff和patch制作及打补丁

git applygit am打补丁.diff 和 .patch

Linux下生成patch和打patch

diff(patch):比较两个文件之间的区别(补丁)