制作补丁
diff -ruN A B > diff.patch
参数:
-r 递归子目录
-u 统一输出格式
-x ".git" 忽略文件,忽略多个就多加-x ""
-N 在比较目录时,若文件A仅出现在某个目录中,预设会显示:Only in目录(不会产生补丁具体信息):文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。
diff.patch
修改1.c和2.c文件,增加3.c,删除4.c
diff -ruN A/1.c B/1.c
--- A/1.c 2018-09-07 15:10:55.993675944 +0800
+++ B/1.c 2018-09-07 14:48:09.345618321 +0800
@@ -1 +1,2 @@
1111
+2222
diff -ruN A/2.c B/2.c
--- A/2.c 2018-09-07 15:10:55.993675944 +0800
+++ B/2.c 2018-09-07 14:48:19.429618746 +0800
@@ -1 +1,2 @@
2222
+3333
diff -ruN A/3.c B/3.c
--- A/3.c 1970-01-01 08:00:00.000000000 +0800
+++ B/3.c 2018-09-07 15:00:42.641650082 +0800
@@ -0,0 +1 @@
+3333
diff -ruN A/4.c B/4.c
--- A/4.c 2018-09-07 15:10:55.993675944 +0800
+++ B/4.c 1970-01-01 08:00:00.000000000 +0800
@@ -1 +0,0 @@
-4444
打补丁
1、补丁与补丁里面描述的顶层目录A在同级:patch -p0 < diff.patch
2、补丁在补丁里面描述的顶层目录A下一级:patch -p1 < diff.patch
(-pn 忽略多少级补丁文件的目录,比如上面把补丁文件拷贝到A目录下,--- A/1.c,用 -p1参数把目录A这一级目录忽略掉。
diff.patch是在与A同级目录下生成,把补丁文件拷贝到A目录下所以需要忽略1级目录)
-RE 单个文件去除补丁,恢复旧版本
-R 目录文件去除补丁,恢复旧版本,如:patch -p0 -R < diff.patch
冲突文件
打完补丁后,需要检查一下有没有拒绝执行的文件,即检查.rej文件的存在。使用命令:
$find . -name *.rej
如果发现,会将其输出到标准输出终端,默认屏幕。当然,你也可以采用重定向,输出到指定文件,比如reject。
$fine . -name *.rej >reject
然后可以查看reject的内容了
异常情况
1、冲突文件,需要查看具体rej文件信息,一般是已经删除或者插入代码。
查看冲突文件:security/keys/gc.c.rej
查看原本文件:已经删除了4行,补丁文件中再去删除就报冲突了
2、提示合入补丁成功,但是代码行号有偏移,需要注意。
3、冲突
对比源文件,这4行已经存在,所以报插入失败。
其他情况
如果目录下只有B和diff.patch文件,执行patch -p0 < diff.patch,会提示如下:
(Stripping trailing CRs from patch.)
patching file B
Reversed (or previously applied) patch detected! Assume -R? [n]
提示是否把B文件还原到A状态,输入y回车,此时就会把B还原到A状态,且提前把B原始文件保存一个B.orig备份文件。