一、生成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+左键点击链接即可看到)