quilt 使用方法

张开发
2026/4/10 17:44:29 15 分钟阅读

分享文章

quilt 使用方法
一、Quilt 是什么Quilt 是一个补丁栈管理工具。想象一下你有 100 个补丁文件每个补丁依赖前一个补丁你需要修改第 50 个补丁如果没有 Quilt你需要手动备份第 50 个补丁之后的 50 个文件应用前 49 个补丁修改代码重新生成第 50 个补丁重新应用后面的 50 个补丁处理冲突…有了 Quilt你只需要quilt push 50应用前 50 个补丁修改代码quilt refresh更新第 50 个补丁二、环境配置1. 安装 Quilt# Ubuntu/Debiansudoapt-getinstallquilt# CentOS/RHELsudoyuminstallquilt# macOSbrewinstallquilt2. 配置.quiltrc文件在用户主目录创建~/.quiltrccat~/.quiltrcEOF # OpenWrt 风格的补丁目录 QUILT_PATCHESpatches # Debian 风格则使用 # QUILT_PATCHESdebian/patches # 补丁格式设置不包含时间戳避免不必要的差异 QUILT_DIFF_ARGS--no-timestamps --no-index -p ab --colorauto QUILT_REFRESH_ARGS--no-timestamps --no-index -p ab # 补丁系列文件 QUILT_SERIESseries # 在 push/pop 时自动创建备份 QUILT_BACKUP1 # 颜色输出 QUILT_COLORSdiff_hdr35:diff_add32:diff_rem31:diff_cctx33 EOF三、完整工作流程示例假设我们在 OpenWrt 环境下修改net-snmp包。步骤 1准备源码# 进入包目录cdopenwrt/package/net/net-snmp# 解压并准备源码OpenWrt 会自动处理makepackage/net-snmp/{clean,prepare}Vs# 进入源码目录cdbuild_dir/target-*/net-snmp-5.9.1/# 初始化 Quilt如果 patches 目录不存在mkdir-ppatches quilt init步骤 2查看现有补丁# 查看所有补丁quilt series# 查看当前应用了哪些补丁quilt applied# 查看还有哪些补丁未应用quilt unapplied输出示例patches/001-cross-compile-fix.patch patches/002-fix-mib-loading.patch patches/003-remove-config-h.patch步骤 3应用所有现有补丁# 应用所有补丁-a 表示 allquilt push-a# 或者逐个应用quilt push# 应用第一个quilt push# 应用第二个输出示例Applying patch patches/001-cross-compile-fix.patch patching file configure.ac patching file Makefile.in Applying patch patches/002-fix-mib-loading.patch patching file agent/mibgroup/mibII/system_mib.c Now at patch patches/002-fix-mib-loading.patch步骤 4创建新补丁# 创建一个新补丁建议用有意义的名称和编号quilt new 004-fix-snmpd-conf-link.patch输出Patch patches/004-fix-snmpd-conf-link.patch is now on top步骤 5关联要修改的文件# 告诉 Quilt 你要修改哪些文件quiltaddagent/snmpd.c quiltaddMakefile.in# 可以一次性添加多个quiltaddagent/*.c include/net-snmp/*.h# 查看当前补丁关联的文件quilt files输出agent/snmpd.c Makefile.in步骤 6修改源代码# 编辑文件vimagent/snmpd.c# 在文件末尾添加例如# /*# * Fix: Remove duplicate config loading# * The symlink /etc/snmp/snmpd.conf - /var/run/snmpd.conf# * causes config to be loaded twice.# */# 也可以使用 sed 批量修改sed-is/old_text/new_text/gsomefile.c步骤 7查看修改# 查看未刷新的修改quiltdiff# 查看特定文件的修改quiltdiffagent/snmpd.c输出示例Index: net-snmp-5.9.1/agent/snmpd.c --- net-snmp-5.9.1.orig/agent/snmpd.c net-snmp-5.9.1/agent/snmpd.c -1234,6 1234,9 main(int argc, char *argv[]) } } /* Skip default config if its a symlink to runtime config */ if (check_symlink_loop(/etc/snmp/snmpd.conf)) skip_default_config 1; /* initialize the agent library */ init_agent(snmpd);步骤 8刷新补丁保存修改# 将修改保存到补丁文件quilt refresh# 添加描述信息quilt refresh-pab --no-timestamps --no-index# 或者先编辑补丁头quilt header-e补丁头编辑示例Description: Fix duplicate config loading when symlink exists /etc/snmp/snmpd.conf is a symlink to /var/run/snmpd.conf. This causes the same config to be loaded twice, resulting in Error opening specified endpoint when agentAddress is specified. . This patch detects symlink loops and skips duplicate loading. Author: Your Name your.emailexample.com Origin: upstream, https://github.com/net-snmp/net-snmp/pull/123 Bug: https://github.com/openwrt/packages/issues/456 Last-Update: 2024-04-09 ---步骤 9测试补丁# 撤销补丁quilt pop# 重新应用测试是否正常quilt push# 如果没问题撤销所有补丁准备打包quilt pop-a步骤 10将补丁添加到包中# 补丁文件位置ls-lapatches/004-fix-snmpd-conf-link.patch# 在 OpenWrt 中补丁需要放在包的 patches 目录cppatches/004-fix-snmpd-conf-link.patch\../../package/net/net-snmp/patches/# 返回包目录重新编译cd../../../makepackage/net-snmp/{clean,compile}Vs四、高级用法1. 修改现有补丁# 假设要修改第 2 个补丁quilt pop-a# 撤销所有quilt push2# 应用到第 2 个quiltaddfile.c# 如果修改了新文件vimfile.c# 修改quilt refresh# 更新补丁quilt pop-a# 撤销所有2. 重命名补丁# 重命名当前栈顶的补丁quiltrename004-better-name.patch# 或者直接编辑 series 文件vimpatches/series3. 删除补丁# 删除补丁确保已 popquilt pop-aquilt delete 004-old-patch.patch# 同时删除补丁文件quilt delete-r004-old-patch.patch4. 导入外部补丁# 导入一个已有的补丁文件quiltimport/path/to/external.patch# 导入并重命名quiltimport-n005-new-feature.patch /tmp/my-patch.diff5. 处理冲突# 如果 push 时出现冲突quilt push# 输出: Patch patches/005-conflict.patch can be reverse-applied# 强制应用会产生 .rej 文件quilt push-f# 手动解决冲突vimfile.c.rejvimfile.c# 标记文件已解决quiltaddfile.c quilt refresh# 清理 .rej 文件rm*.rej6. 补丁合并# 将多个补丁合并为一个quilt pop-aquilt push3# 应用到第 3 个quiltfoldpatches/004-*.patch# 合并第 4 个到当前quiltfoldpatches/005-*.patch# 合并第 5 个quilt refresh# 生成合并后的补丁五、常见问题处理1. 忘记quilt add就修改了文件# 补救方法quiltadd-ffile.c# -f 强制添加已修改的文件quilt refresh2. 撤销未刷新的修改# 恢复到修改前的状态quilt pop-f# 强制 popquilt push# 重新应用3. 查看补丁详情# 查看补丁头quilt header# 查看补丁修改的文件列表quilt files# 查看补丁统计quiltdiff--stat4. 调试补丁应用过程# 详细输出模式quilt push-v# 干运行不实际应用quilt push --dry-run六、与 OpenWrt 集成OpenWrt 特定的工作流# 1. 准备包makepackage/net-snmp/prepareVs# 2. 进入构建目录cdbuild_dir/target-mips_24kc_musl/net-snmp-5.9.1/# 3. 应用所有补丁quilt push-a# 4. 修改代码quilt new100-fix-something.patch quiltaddagent/snmpd.cvimagent/snmpd.c quilt refresh# 5. 更新 patches 目录makepackage/net-snmp/updateVs# 6. 重新编译makepackage/net-snmp/compileVs补丁命名规范OpenWrt001-cross-compile-fix.patch # 三位数字前缀 002-fix-mib-loading.patch # 短横线分隔 003-remove-config-h.patch # 小写字母 004-support-mips64.patch # 描述性名称七、总结常用命令速查命令作用quilt init初始化补丁目录quilt new name.patch创建新补丁quilt add file关联文件到当前补丁quilt refresh保存修改到补丁quilt push应用下一个补丁quilt pop撤销当前补丁quilt series列出所有补丁quilt applied列出已应用的补丁quilt files列出当前补丁关联的文件quilt diff查看未刷新的修改quilt header -e编辑补丁头信息quilt delete name.patch删除补丁quilt rename new.patch重命名补丁

更多文章