diff patch

一、生成patch的过程

diff命令是制作patch的必要工具,基本上只需要diff -Nau这个参数,要是比较文件夹要加上-r,即-Naru。

一般我最常使用的是:diff  -Naru file1 file2 > file.patch

[root@localhost SPECS]# diff -Naru text1 text2 > text.patch   //将补丁保存在text.patch中
[root@localhost patch]# patch -p0<text.patch    //用补丁修改text1

注意:

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]# 


温馨提示:

在我最近写的关于做盘的一篇博客

loongson服务器制作镜像及刻录光盘的全过程

中就有具体的实例的 点击打开链接(按ctrl+左键点击链接即可看到)























你可能感兴趣的:(patch,diff,打补丁)