资讯动态

quilt 使用方法

发布时间:2026/10/2 11:34:14 来源:尧图企业网站定制
一、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重命名补丁

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑