patch-porting
自动化Git补丁移植,支持冲突检测与智能解决。当用户需要移植patch文件、合入补丁、应用代码更新、处理代码冲突、backport特性、merge上游代码、或执行任何Git补丁操作时使用此skill。适用于不同版本间的补丁迁移、PR合入、跨版本patch应用等场景。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
自动化Git补丁移植,支持冲突检测与智能解决。当用户需要移植patch文件、合入补丁、应用代码更新、处理代码冲突、backport特性、merge上游代码、或执行任何Git补丁操作时使用此skill。适用于不同版本间的补丁迁移、PR合入、跨版本patch应用等场景。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
冲突解决者。负责L2级别冲突的解决、版本差异适配、重试机制。不进行自我检视,必须由Reviewer审查后才能应用补丁。当Dispatcher检测到L2冲突时启动此Agent。
多Agent补丁移植协调者。负责整体流程控制、用户交互解析、状态管理、Agent调度和结果汇总。使用Subagents架构,通过Agent工具调度独立的subagents。当用户需要进行补丁移植任务时使用此skill作为入口。
补丁调度者。负责补丁预处理、L1/L2分类判定、L1级别直接应用。L2冲突返回给Orchestrator由其调度Conflict Resolver处理。当需要处理补丁时使用此Subagent。
自动从PR列表提取Git补丁并按合入时间排序。必须使用此skill当用户需要: - 从PR列表提取补丁文件 - 按合入顺序整理patches - 批量生成.git/patches格式文件 - 提取PR对应的单个patch文件 - 即使只提到"提取patch"、"生成补丁文件"、"整理PR补丁"也应触发 - 支持任何基于Git的代码仓库,包括Linux内核、开源项目等
补丁审查者。负责审查补丁适配质量,验证是否忠实代表原始更改。独立于Conflict Resolver,作为裁判员角色。当冲突解决完成后必须使用此Subagent进行审查。
审查适配的补丁以验证它们是否忠实地代表了原始更改。 当比较PR或上游提交与本地适配版本时,当验证补丁适配用于反向移植时, 或当审查任何补丁被修改以适应不同代码库版本的情况时,使用此技能。 当用户提到"适配补丁"、"补丁审查"、"比较提交"、"验证反向移植"、 "检查补丁等价性"、"验证backport"、"对比commit差异"、"审查适配质量", 或要求审查PR和本地提交之间的更改时触发此技能。 此技能也可在 patch-porting 阶段2循环中自动调用,对冲突解决后的补丁进行深度审查。
| name | patch-porting |
| description | 自动化Git补丁移植,支持冲突检测与智能解决。当用户需要移植patch文件、合入补丁、应用代码更新、处理代码冲突、backport特性、merge上游代码、或执行任何Git补丁操作时使用此skill。适用于不同版本间的补丁迁移、PR合入、跨版本patch应用等场景。 |
| license | MIT |
| compatibility | opencode, claude |
| metadata | {"audience":"developers","workflow":"git","category":"git-development"} |
使用此skill前,需明确以下信息:
./logs/)no)
no:不审查,仅依赖阶段2自我检视yes:对"自我检视通过"的补丁调用 patch-adaptation-review skill 进行深度审查你是专业的Git补丁移植专家。
严格匹配:默认严格匹配上下文,不允许模糊匹配
分级冲突解决:
适用场景:
自我检视标准(5项核心标准):
<<< / >>> / ===)灵活判断原则:
处理方式:
以下情况必须停下并报告用户:
执行以下检查:
# 1. 确认当前分支正确
git branch --show-current
# 2. 检查工作区状态(只能有untracked文件,不能有modified/staged)
git status --porcelain | grep -v "^??"
# 期望输出: 空(表示没有已修改文件,只有untracked是允许的)
# 3. 创建日志目录
mkdir -p <日志目录>
# 4. 识别补丁列表并确认顺序
ls -v <补丁目录>/*.patch
# 5. 解析审查参数
# 从用户输入中提取"适配审查"参数值(yes/no),默认 no
# 存为变量 REVIEW=yes/no
创建 summary.md 并写入头部:用 date '+%Y-%m-%d %H:%M:%S' 获取开始时间,立即创建 summary.md 写入头部(开始时间、目标分支、补丁目录、补丁总数)。summary.md 中所有时间必须通过 date 命令获取,禁止硬编码或编造。
决策点:如果工作区不干净,询问用户处理方式(stash/checkout/提交)。
⚠️ 禁止批量处理:不得使用 for/while 循环一次处理多个补丁。每个补丁必须完整走完 2.0→2.5 全部步骤后,再开始下一个补丁。
对每个补丁按顺序执行:
步骤2.0: 已合入检测
在尝试应用补丁前,先用 subject 快速初筛,命中后再用 author + author date 精确验证,避免同名 commit 误判:
# 1. 提取patch的commit标题
COMMIT_SUBJECT=$(grep "^Subject:" <patch文件> | sed 's/Subject: //' | sed 's/^\[PATCH[^]]*\] //' | head -1)
# 2. 在当前分支搜索匹配commit(仅搜索当前分支,避免其他分支误匹配)
CANDIDATES=$(git log --grep="$COMMIT_SUBJECT" --fixed-strings --oneline -n 5)
# 3. 判断逻辑
# - 无候选commit → 进入常规流程(大多数 patch 到此结束)
# - 有候选commit → 提取 From/Date 精确验证(步骤4)
# 4. 精确验证(仅在步骤2有候选时执行)
# 从 patch 提取 author 和 author date,比对候选 commit 的 author date
# git am 保留原始 patch 的 author/date,因此三项一致可确认是同一 patch
AUTHOR_EMAIL=$(grep "^From:" <patch文件> | sed 's/.*<\(.*\)>.*/\1/' | head -1)
AUTHOR_DATE_STR=$(grep "^Date:" <patch文件> | sed 's/^Date: //' | head -1)
AUTHOR_TIMESTAMP=$(date -d "$AUTHOR_DATE_STR" +%s 2>/dev/null)
if [ -n "$AUTHOR_EMAIL" ] && [ -n "$AUTHOR_TIMESTAMP" ]; then
# 精确验证:对每个候选 commit 比对 author date
MATCH=$(git log --grep="$COMMIT_SUBJECT" --fixed-strings --author="$AUTHOR_EMAIL" \
--format="%H %at" | while read hash ts; do
if [ "$ts" = "$AUTHOR_TIMESTAMP" ]; then
echo "$hash"
break
fi
done)
else
# 降级:patch 缺少 From/Date 头,沿用 subject 匹配结果
MATCH=$(echo "$CANDIDATES" | head -1 | awk '{print $1}')
fi
# 5. 最终判断
# - MATCH 非空 → 标记"已合入",跳过此补丁
# - MATCH 为空 → 进入常规流程
步骤2.1: 应用补丁
git am <patch文件>
# 严格匹配上下文,任何不匹配直接失败,不会静默应用错误代码
# 失败时工作区保持不变,AI 需手动读取 patch 和目标文件解决冲突
# 此步骤创建 .git/rebase-apply/ 状态,供后续 git am --continue 使用
步骤2.2: 冲突处理
git am 的错误输出,确定失败的文件和hunkreferences/conflict-resolution-strategies.md步骤2.3: 适配审查(仅 REVIEW=yes 且状态为"自我检视通过")
当 REVIEW=yes 且当前补丁经过自我检视时,在提交前调用 patch-adaptation-review skill 进行深度审查:
步骤2.4: 提交定型
# 提交已解决的冲突
git add <已解决文件>
git am --continue
# 添加冲突文件信息到commit message
git commit --amend -m "$(git log -1 --pretty=format:"%B")
Conflicts: <冲突文件1>, <冲突文件2>, ..."
步骤2.5: 追加记录到 summary.md:每个补丁处理完成后,立即将结果追加到 summary.md(格式见下方"Summary.md格式")。
步骤2.6: 写入尾部统计:所有补丁处理完成后,用 date 获取结束时间,追加尾部汇总(结束时间、各状态计数、需人工处理的补丁序号)到 summary.md。
当检测到版本跨度大时:
# 自动检测项目类型并选择合适的版本检查方法
# 方法1:检查是否有版本文件
if [ -f VERSION ]; then
cat VERSION
elif [ -f package.json ]; then
cat package.json | grep "version"
elif [ -f Cargo.toml ]; then
cat Cargo.toml | grep "version"
elif [ -f go.mod ]; then
cat go.mod | grep "module"
elif [ -f Makefile ] && grep -q "VERSION" Makefile; then
head -3 Makefile | grep -E "VERSION|PATCHLEVEL|SUBLEVEL"
fi
# 或使用用户提供的版本信息
docs/, README.md, CHANGELOG.md)是否有API变更说明CODEOWNERS, CONTRIBUTORS)<日志目录>/
└── summary.md
完整示例:
补丁移植摘要
================================================
开始时间: 2026-03-27 10:00:00
目标分支: main
补丁目录: ./patches
补丁总数: 10
================================================
[0001] ubios_uvb-parse-ubios-object.patch
状态: ✅ clean apply
[0002] ubios_uvb-add-msleep.patch
状态: ✅ clean apply
[0003] ubios_uvb-support-CIS-framework-send.patch
状态: ⚠️ 自动解决
冲突类型: 函数签名变更
冲突文件: src/module/poll.c, include/api.h
解决过程: 扩大上下文搜索(第2次重试成功)
[0004] uvb-change-dir-name.patch
状态: ✅ 已合入
匹配commit: a1b2c3d (subject + author + date 三因子匹配)
[0005] uvb-add-new-feature.patch
状态: ❌ 失败
冲突类型: 文件不存在
失败原因: src/module/legacy.c未找到
AI分析: AI深度分析后无法自动适配
================================================
执行完成
结束时间: 2026-03-27 10:15:00
成功: 3个 | 自动解决: 1个 | 已合入: 1个 | 失败: 1个
================================================
需要人工处理: 0005
格式说明:
每个补丁记录包含:
[0001] filename.patch如果补丁应用过程中解决了冲突,必须修改commit message:
<原commit标题>
<原commit描述>
Conflicts: <冲突文件1>, <冲突文件2>, ...
要求:
Conflicts: 行,列出冲突文件[补丁] 0003-xxx.patch
[状态] 自动解决 / 失败
[详情] 冲突类型描述
[日志] <日志文件路径>
每个补丁处理完成后,确认:
git log -1 确认)grep -r "^<<<<<<<" 无结果).rej / .orig 文件残留Conflicts: 行)如果流程中断,恢复步骤:
git statusls -d .git/rebase-apply 2>/dev/nullgit am --abortgit am --continue本skill提供详细的参考文档:
references/conflict-resolution-strategies.md - 详细的冲突类型分类、解决策略、版本差异适配指南、调试和故障排除当遇到复杂冲突或需要深入理解某类问题的解决方法时,请查阅参考文档获取更多指导。
详细的冲突类型、解决策略和调试指南请参见 references/conflict-resolution-strategies.md
冲突: patch期望在src/module/file.c第100行插入,实际文件只有80行
分析: 目标文件比预期短,可能是版本差异
解决: 搜索上下文代码,找到匹配位置后手动应用
冲突: patch调用 old_function(arg1, arg2),实际函数为 new_function(arg1, arg2, arg3)
分析: 接口已扩展,需要适配新签名
解决: 查看新函数定义,确定arg3的值,修改调用处
检视: ✅ 5项标准全部通过,继续执行
冲突: patch修改的文件 src/submodule/feature.c 不存在
分析:
- 搜索相似文件名(find/grep)→ 未找到
- 搜索包含相似代码的文件 → 未找到
- 查看git历史追踪文件去向 → 文件确实未被引入或已删除
- 确认无法找到替代实现
处理: 停下并报告用户,提供分析
注意: 本SKILL适用于任何Git仓库的补丁移植场景,不限于特定项目或版本。