在项目中,有些模块是开源的,没有源码或者不能改动源码,想要修复、优化里面的Bug,这时就需要用到patch了。
1. 生成patch
制作补丁有两种法法,diff和quilt。
1.1 diff方法制作patch
1.1.1 示例
l 第一步,创建两个文件,test.c源文件和修改后的文件test_1.c。
ubuntu:~/code/test/patch$ cat test.c aa bb ubuntu:~/code/test/patch$ cat test_1.c aa 11 22 bb
l 第二步,生成补丁,diff -u test.c test_1.c > 01_test.patch
ubuntu:~/code/test/patch$ cat 01_test.patch --- test.c 2018-07-20 15:48:43.694824855 +0800 +++ test_1.c 2018-07-20 15:49:08.650825272 +0800 @@ -1,2 +1,4 @@ aa +11 +22 bb
1.1.2 diff命令
简 单的说,diff的功能就是用来比较两个文件的不同,然后记录下来,也就是所谓的diff补丁。
diff [options] from-file to-file
from-file 源文件
to-file 根据源文件修改后的文件
option:
-u 显示有差异行的前后几行(上下文), 默认是前后各3行, 这样, patch中带有更多的信息.
-p显示代码所在的c函数的信息
-N 选项确保补丁文件将正确地处理已经创建或删除文件的情况。
-a逐行比较文本文件
-r比较子目录中的文件
1.2 quilt方式制作patch
quilt是一个制作和应用补丁的工具,它适合于管理较多补丁。
1.2.1 示例
l 第一步,quilt new 02_test.patch新加一个补丁文件
l 第二步,修改文件quilt edit test.c,进入文本框进行文件编辑
aa 11 22 bb ^G Get Help ^O WriteOut ^R Read File ^Y Prev Page ^K Cut Text ^C Cur Pos ^X Exit ^J Justify ^W Where Is ^V Next Page ^U UnCut Text ^T To Spell
l 第三步,quilt refresh将改动保存到patch中。
当前目录下增量了pathc目录,补丁文件02_test.patch即放在了改目录下。
ubuntu:~/code/test/patch$ cat patches/02_test.patch Index: patch/test.c =================================================================== --- patch.orig/test.c 2018-07-20 15:48:43.694824855 +0800 +++ patch/test.c 2018-07-20 16:06:31.490842723 +0800 @@ -1,2 +1,4 @@ aa +11 +22 bb
1.2.2 quilt命令
quilt top 查看最近的一个patch
quilt add {files} 关联文件
quilt remove files 取消关联文件,是add相反的操作
quilt diff 查看对比修改的内容
quilt files 查看当前patch关联的文件
quilt series 查看左右的patch
quilt pop 回退刚才文件的改动
2. 打patch
2.1 示例
l 第一步,存在两个文件,源文件test.c和patch文件01_test.patch
ubuntu:~/code/test/patch$ cat test.c aa bb ubuntu:~/code/test/patch$ cat 01_test.patch --- test.c 2018-07-20 15:48:43.694824855 +0800 +++ test_1.c 2018-07-20 15:49:08.650825272 +0800 @@ -1,2 +1,4 @@ aa +11 +22 bb
l 第二步,打patch,patch test.c < 01_test.patch,查看源文件,已经有了补丁上的修改。
ubuntu:~/code/test/patch$ cat test.c aa 11 22 bb
2.2 命令
patch -RE < 01_test.patch 取消patch对源文件的修改
patch -p1 < patch1.diff
p表示跳过几级目录,0标识不去掉为全路径,1标识去掉第一层路径
注意:patch -p后面是不能带负数 的。不使用p参数的时候,patch命令会 忽略 任何目录,直接使用文件。