运维部署
Terraform Provider…
在 Terraform provider 子模块中,用 ./scripts/upstream.sh 安全地创建、修改、删除和 rebase patches/ 补丁。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
Terraform Provider 上特定
解决思路
- 使用 ./scripts/upstream.sh 管理补丁状态;upstream/ 是指向上游 Terraform provider 的 git submodule,patches/ 是叠加在上游之上的补丁文件。
- 如果是在修复现有补丁引入的回归,修改拥有该补丁的提交(owning patch commit),不要新建补丁。
- 除非用户明确要求,否则不要创建新补丁。
- 命令 ./scripts/upstream.sh init:初始化 upstream 并将补丁应用到工作目录。
- 命令 ./scripts/upstream.sh init -f:破坏性丢弃 checkout/rebase 状态并重新初始化 upstream。
- 命令 ./scripts/upstream.sh checkout:创建带有补丁提交的分支,用于编辑。
- 命令 ./scripts/upstream.sh rebase -i:交互式编辑补丁提交。
- 命令 ./scripts/upstream.sh rebase -o <commit>:将补丁变基到新的上游提交。
- 命令 ./scripts/upstream.sh check_in:将提交写回 patches 并退出 checkout 模式。
- 绝不要在未经过 checkout/check_in 的情况下直接提交到 upstream/。
- 在 checkout 之外直接编辑 upstream/ 下的内容,在 upgrade-provider 期间是临时的;工具会重置 submodule 状态。
- 不要手工编辑 patches/*.patch,除非有意进行原始补丁手术。
- 对 agent 而言,优先使用非交互式重写流程,而不是交互式 rebase。
- 在编辑补丁内容之前,先识别拥有该补丁的 patch/commit。
- 查找所属补丁时运行 ./scripts/upstream.sh checkout。
- 通过被触碰的文件路径或唯一 hunk 文本查找候选补丁文件:rg -n "path/to/file|unique_symbol" patches/*.patch。
- 可选:检查候选补丁头部/hunks:sed -n '1,120p' patches/00NN-Example.patch。
- 将补丁文件映射到 upstream checkout 分支中的提交:patch=patches/00NN-Example.patch。
- 提取补丁主题:subject=$(sed -n 's/^Subject: \[PATCH\] //p' "$patch" | head -n1)。
- 进入 upstream:cd upstream。
- 按主题查找提交:git log --oneline pulumi/patch-checkout --grep "$subject"。
- 如有需要,按被触碰路径消歧:git log --oneline pulumi/patch-checkout -- path/to/file。
- 返回上级目录:cd ..。
- 如果 rg 不可用,使用 grep -En 做补丁搜索。
- 将 target_sha 设置为 owning commit,并编辑该提交,而不是 HEAD。
- 修改现有补丁的首选非交互式流程:运行 ./scripts/upstream.sh checkout。
- cd upstream。
- 设置 target_sha=<owning-commit-sha>。
- 计算父提交:base_sha=$(git rev-parse "${target_sha}^")。
- 设置临时分支:tmp_branch="rewrite-${target_sha:0:8}"。
- 从目标提交的父提交重建历史:git checkout -b "$tmp_branch" "$base_sha"。
- 应用目标提交:git cherry-pick "$target_sha"。
- 应用修复并 amend 目标提交:编辑文件。
- 暂存文件:git add <files>。
- amend 目标提交:git commit --amend --no-edit。
- 重放其余提交:git cherry-pick "${target_sha}..pulumi/patch-checkout"。
- 如果 cherry-pick 冲突:解决文件。
- 暂存已解决文件:git add <resolved files>。
- 继续 cherry-pick:git cherry-pick --continue。
- 将 checkout 分支移动到重写后的历史:git branch -f pulumi/patch-checkout HEAD。
- 切回 checkout 分支:git checkout pulumi/patch-checkout。
- 删除临时分支:git branch -D "$tmp_branch"。
- 返回上级目录:cd ..。
- 交互式备选:./scripts/upstream.sh checkout。
- 交互式备选:./scripts/upstream.sh rebase -i。
- 交互式备选:将目标提交标记为 edit,amend,然后 continue。
- 删除整个补丁:rm patches/00NN-Description.patch。
- 删除整个补丁:./scripts/upstream.sh checkout。
- 删除整个补丁:./scripts/upstream.sh check_in。
- 删除补丁的一部分时,先找到 owning patch/commit(target_sha),并使用上面的 amend 工作流。
- 删除补丁的一部分时,只还原目标提交中不想要的变化,然后 amend。
- 删除补丁的一部分示例:cd upstream。
- 删除补丁的一部分示例:git checkout HEAD^ -- path/to/docs-only-file path/to/another-doc-file。
- 删除补丁的一部分示例:git add path/to/docs-only-file path/to/another-doc-file。
- 删除补丁的一部分示例:git commit --amend --no-edit。
- 删除补丁的一部分示例:cd ..。
- 仅在被明确要求时创建新补丁:./scripts/upstream.sh checkout。
- 仅在被明确要求时创建新补丁:cd upstream。
- 仅在被明确要求时创建新补丁:进行修改。
- 仅在被明确要求时创建新补丁:git add <files>。
- 仅在被明确要求时创建新补丁:git commit -m "Describe new patch"。
- 仅在被明确要求时创建新补丁:cd ..。
- 仅在被明确要求时创建新补丁:./scripts/upstream.sh check_in。
- 将补丁变基到新的上游版本:./scripts/upstream.sh checkout。
- 变基到新的上游提交:./scripts/upstream.sh rebase -o <new_commit_sha>。
- 解决出现的冲突。
- 写回更新后的补丁文件:./scripts/upstream.sh check_in。
- check_in 前:确认预期补丁数量变化(默认 0;完整删除补丁时为 -1)。
- check_in 前:确认目标补丁应保留(默认是)还是移除(显式删除场景)。
- check_in 前:确认你在编辑 owning commit,而不是意外添加新提交。
- check_in 后:验证补丁数量符合预期。
- check_in 后:验证目标补丁编号/目的在预期情况下仍然存在。
- check_in 后:验证没有引入意外的新的 00NN-*.patch。
- 中断的 checkout 或 rebase:默认保留工作。
- 中断时检查:git -C upstream status。
- 完成正在进行的 git am/rebase。
- 验证每个补丁都已应用。
- 在重新运行自动化前运行 ./scripts/upstream.sh check_in。
- 注意:中断的 checkout 会对每个补丁单独调用 git am,因此后面的补丁文件可能尚未处理。
- 仅当有意丢弃所有中断工作时才使用 ./scripts/upstream.sh init -f。
- init -f 可能删除冲突解决、补丁提交、操作元数据、未跟踪文件;它不是卡住的 checkout 的常规恢复手段。
适用边界 · 注意事项
- 不适用于没有 upstream/、patches/ 或 ./scripts/upstream.sh 的项目。
- 用户未明确要求新增补丁时,不要创建新补丁。
- 不要将 ./scripts/upstream.sh init -f 作为中断 checkout/rebase 的常规恢复手段;它只用于有意丢弃所有工作。