09 diff patch quilt
1. diff
按行比较两个文件的差异
参数:
diff [命令行选项] 原始文件目录 新文件目录
-p : 在每一个更改处显示c函数
-u : 按照统一格式输出(默认3行)
-N : 对于不存在的文件,认为是空白文件或者新增文件
-r : 递归
-a : 所有文件都视为文本文件逐行比较
常用 -uparN
eg:
diff -Nuarp a b > different.patch
2. patch
参数
-f : 强制打入补丁
-pN : 滤过N层前导目录
-E : 打完补丁后,如果文件内容为空,将其删除
-d : 表示在指定目录下执行
-R : 这个选项用于删除补丁
--dry-run : 试打入,输出打入这个补丁的结果。但不做任何修改
eg:
去掉patch文件中路径的第一个元素
patch -p1 < ../different.patch
3. quilt
(不常用)
quilt
同意具有生成补丁的应用补丁的功能。相对于diff
和patch
而言,它还具有管理补丁的功能。quilt
的管理结构类似于堆栈,先入后出这样。
还需要注意的是quilt
是在源代码中生成一个patches
目录,将补丁存在在目录中。所有quilt refresh
之后需要update
3.1 基本用法
sudo apt-get install quilt
quilt top
查询最后一个提交- 应用补丁(压栈)
quilt push -a
应用所有
quilt push 013-redirect-all-traffic.patc
应用001->013
quilt push
应用单个 - 取消应用(出栈)
quilt pop -a
取消所有
quilt pop 002-helloworld.patch
从栈顶取消到02
quilt pop
取消单个 - 创建新补丁
quilt new xxx.patch
- 添加修改文件(记录文件初始状态)
quilt add xxx
当文件被修改完成后,只需要quilt refresh
刷新一下,此命令会去保存 - 查询当前补丁中被修改的文件
quilt files
- 查询修改点
quilt diff
3.2 openwrt
中的使用
3.2.1 添加新补丁
make package/example/{clean,prepare} V=s QUILT=1
对于主机端包make package/example/host/{clean,prepare} V=s QUILT=1
解压出补丁cd build_dir/target-*/example-*
到目的文件quilt push -a
应用所有补丁(入栈)quilt new 010-main_code_fix.patch
新建一个补丁quilt edit src/main.c
将编辑文件与新建文件建立关联quilt diff
可选quilt refresh
make package/example/update V=s
将补丁文件移到到buildroot
make package/example/{clean,compile} package/index V=s
3.2.2 修改现有补丁
make package/example/{clean,prepare} V=s QUILT=1
对于主机端包make package/example/host/{clean,prepare} V=s QUILT=1
解压出补丁cd build_dir/target-*/example-*
到目的文件quilt series
列出可供修改的补丁quilt push 010-main_code_fix.patch
修改补丁quilt edit src/main.c
将编辑文件与补丁文件建立关联quilt diff
可选quilt refresh
make package/example/update V=s
将补丁文件移到到buildroot
make package/example/{clean,compile} package/index V=s