一、生成patch的过程
diff命令是制作patch的必要工具,基本上只需要diff -Nau这个参数,要是比较文件夹要加上-r,即-Naru。
一般我最常使用的是:diff -Naru file1 file2 > file.patch
[root@localhost SPECS]# diff -Naru text1 text2 > text.patch //将补丁保存在text.patch中p(n):p是path的缩写,n是将patch文件中的path第n条‘/’及其左边部分取消
怎样看.patch文档,下面我们举个例子来说一下:
加
假设左图为test1文件,中间为test.patch文件,右图为test2文件,最上面一行为你在终端上敲的命令diff.........
---:为第一个文件的标识符号
+++:为第二个让文件的标识符号
@@ -10,10 +10,10@@:-代表第一个文件,第一个参数10代表原文件的第10行,第二个参数10代表从原文件第10行开始往下显示10 的内容;+代表第二个文件,第三个10 代表从第二个文件的第十行开始显示,第四个10 代表从第二个文件的第十行开始往下数10行在patch文件中显示出来。总之一句话,将显示第一个文件的(10-19行)和第二个文件的(10-19行),行前带有+或-的地方说明是两个文件的不同之处。
二、通过*.patch文件修改原文件为目标文件
下面举个例子
$:cat text1 11111 22222 111111111111111111 $:cat text2 11111 22222 333333333333333333333 444444444444444444444 11111 2222222222 $:diff -Naru text1 text2 > text.patch //生成*.patch文件 $:cat text.patch --- text1 2015-10-20 15:55:00.091263077 +0800 +++ text2 2015-10-20 15:47:05.822263097 +0800 @@ -1,3 +1,7 @@ 11111 22222 -111111111111111111 +333333333333333333333 +444444444444444444444 +11111 +2222222222 + $:patch -p0 < text.patch //通过*.patch文件修改text1 用pn patching file text1 $:vim text1 11111 22222 333333333333333333333 444444444444444444444 11111 2222222222 $:patch -Rp0 < text.patch //还原修改的内容 用Rpn patching file text1 $: cat text1 11111 22222 111111111111111111 [root@zhangna patch]#
三、两种常见的情况,下面举例说明
情况1:就是通过比较具体的文件生成的*.patch文件
情况2:就是通过比较目录生成的*.patch文件
[root@zhangna myself_document]# mkdir a1 [root@zhangna myself_document]# mkdir b1 [root@zhangna myself_document]# ls a1 b1 gettext iso_file patch project project1 python rpmbuild shell [root@zhangna myself_document]# cat ./a1/a.c aaaaaaaaaaaaaaaaaaaa [root@zhangna myself_document]# cat ./b1/a.c aaaaaaaaaaaaaaaaaaaa 11111111111111111111 2222222222222222222 333333333333333333 [root@zhangna myself_document]# diff -Naru ./a1/a.c ./b1/a.c > diff.patch //情况1:通过比较具体的文件生成的*.patch文档 [root@zhangna myself_document]# cat diff.patch --- ./a1/a.c 2015-10-23 09:47:53.731369459 +0800 +++ ./b1/a.c 2015-10-23 09:48:42.242367921 +0800 @@ -1,2 +1,4 @@ aaaaaaaaaaaaaaaaaaaa - +11111111111111111111 +2222222222222222222 +333333333333333333 [root@zhangna myself_document]# cd a1 //该情况需要在源文件的上一级目录下,参数为p0进行打patch [root@zhangna a1]# cd .. [root@zhangna myself_document]# patch -p0 < diff.patch patching file ./a1/a.c [root@zhangna myself_document]# cat ./a1/a.c aaaaaaaaaaaaaaaaaaaa 11111111111111111111 2222222222222222222 333333333333333333 [root@zhangna myself_document]# patch -Rp0 < diff.patch patching file ./a1/a.c [root@zhangna myself_document]# cat ./a1/a.c aaaaaaaaaaaaaaaaaaaa [root@zhangna myself_document]# rm diff.patch rm:是否删除普通文件 "diff.patch"?y [root@zhangna myself_document]# diff -Naru a1 b1 > diff.patch //情况2:通过比较2个目录生成的*.patch文档 [root@zhangna myself_document]# ls a1 b1 diff.patch gettext iso_file patch project project1 python rpmbuild shell [root@zhangna myself_document]# cd a1/ [root@zhangna a1]# cd - /home/zhangna/myself_document [root@zhangna myself_document]# cat diff.patch diff -Naru a1/a.c b1/a.c --- a1/a.c 2015-10-23 09:51:17.266368970 +0800 +++ b1/a.c 2015-10-23 09:48:42.242367921 +0800 @@ -1,2 +1,4 @@ aaaaaaaaaaaaaaaaaaaa - +11111111111111111111 +2222222222222222222 +333333333333333333 [root@zhangna myself_document]# cd a1 [root@zhangna a1]# patch -p1 < ../diff.patch //在比较目录下生成的patch文档,在打patch的时候,需要切换到源文件下, 参数为p1 patching file a.c [root@zhangna a1]# cat a.c aaaaaaaaaaaaaaaaaaaa 11111111111111111111 2222222222222222222 333333333333333333 [root@zhangna a1]# patch -Rp1 < ../diff.patch patching file a.c [root@zhangna a1]# cat a.c aaaaaaaaaaaaaaaaaaaa [root@zhangna a1]#
温馨提示:
在我最近写的关于做盘的一篇博客