常用补丁工具操作及适用场景,不仅限于Linux/OpenWrt。
Quilt
网上教程几乎看不到(估计是这个工具的名字不太好,冲突了),补丁生成后会在Makefile目录下生成patches目录,用于存放quilt格式补丁文件。
$ ls feeds/packages/strongswan
files Makefile patches
使用场景
-
源码使用quilt打补丁,那就照着套路来,继续用quilt;
-
对已打包好的源码包进行二次开发(不解包无法看到源码全貌),如:
- Linux内核
- OpenWrt中feeds目录下的绝大部分第三方软件包
好
- 省去手动解包打包流程
- 只是在源码包的基础上进行修改,patch默认置于外部,也就无需重新回填MD5校验值(Makefile)
- 回滚操作简单
不好
- 修改权限不能(644->755)
- 每次都需要先
quilt push -a
,略麻烦 - 同时修改多个旧补丁文件,容易引发冲突(简单的办法是只管往上叠,后面再合并旧的)
操作(基本)
-
安装
sudo apt-get install quilt
-
查看最近的补丁(最后一个)(初始为空)
quilt top
-
应用补丁(压栈)
- 所有:
quilt push -a
- 到指定位置:
quilt push 013-redirect-all-traffic.patch
(001->013) - 单个:
quilt push
- 所有:
-
取消应用(弹栈)(回滚)
- 所有:
quilt pop -a
- 到指定位置:
quilt pop 002-helloworld.patch
(013->002) - 单个:
quilt pop
- 所有:
-
创建补丁
quilt new xxx-new-page-about-patch-tools.quilt
-
添加欲修改文件(记录下文件初始状态)
quilt add README.md
-
修改,开发
quilt edit README.md
你不一定要用quilt edit
来对文件进行修改,edit只是调取外部编辑器供用户编辑,完后quilt再自动与初始副本进行比较,得出差异项(patch),于是乎:
你可以使用其它喜欢的编辑器(Sublime/gVim/VsCode…)来编辑,保存后只需来一句:quilt refresh
(常用如scp/sftp,远程编辑) -
保存为patch
quilt refresh
-
查看当前补丁中已修改文件
quilt files
-
已修改(当前补丁)
quilt diff
操作(高级)
流程
以OpenWrt - strongSwan为例:
- 准备环境,释放代码,准备补丁库
make package/feeds/packages/strongswan/{clean,prepare} V=s QUILT=1
- 切换至临时开发目录
cd build_dir/target*/strongswan*/
- 打补丁
应用所有
quilt push -a
应用部分
quilt push XXX-redirect...patch
撤销补丁
quilt pop XXX-redirect...patch
撤销所有
quilt pop -a
当前补丁
quilt top
- 新增补丁或编辑旧补丁
quilt new xxx-*.patch
- 添加追踪
quilt add xxx.c
- 编辑
quilt edit xxx.c
- 确认修改(可选)
quilt files && quilt diff
- 保存修改
quilt refresh
- 回到主目录,将补丁从临时开发目录更新至补丁库(Makefile同级patches)
cd ../../../ && make package/feeds/packages/strongswan/update V=s
- 重新编译
make package/feeds/packages/strongswan/{clean,compile} V=s
V=s相当于Verbose,输出详细log
Git
教程多,主流
理解原理才能有效避免合并冲突
廖雪峰Git教程 - 分支管理
使用场景:
- 使用git clone的代码
- 使用git进行代码管理的软件
- 完整代码可直接浏览(与quilt相反)
操作
鸣谢
前同事,他姓黄
给LuCI挖的坑
OpenWrt交叉编译环境