研发协作
大规模代码库迁移与多文件重构时,如何分批提交可审查的 PR…
当需要在数百个文件中做同一种改造(框架升级、API 重命名、配置迁移)并希望以可审查的小批次安全落地时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
大规模代码库迁移与多文件重构时,如何分批特定
解决思路
- 精确定义要做的转换:不要写「迁移到 vitest」,而要写「把 jest.mock 换成 vi.mock、jest.fn() 换成 vi.fn()、用模板 X 把 jest.config.js 重命名为 vitest.config.ts」。
- 用 rg 评估影响范围,例如 rg -l 'jest\.(mock|fn|spyOn)' | wc -l 和 rg -l 'from "jest"' | sort。
- 创建跟踪 issue(如 composio execute LINEAR_CREATE_ISSUE),描述中写明每批约 25 个文件、每个 PR 变绿后再继续。
- 按可审查的小批次循环执行:挑选 N 个文件 → 转换 → 测试 → 提 PR → 等 CI 变绿 → 合并 → 下一批。
- 用批处理辅助命令选出前 25 个未处理文件:BATCH=$(rg -l 'jest\.mock' | grep -v done.list | head -25); echo "$BATCH" > batch.list。
- 对 batch.list 运行 codemod(如 jscodeshift / ts-morph / comby),然后 git checkout -b migrate/vitest-batch-03、xargs < batch.list codemod-runner、npm test -- --changed、git add -A && git commit、git push -u origin。
- 用 composio execute GITHUB_CREATE_A_PULL_REQUEST 创建 PR,body 中注明所属 issue 和使用的 codemod 脚本。
- 用 composio execute GITHUB_LIST_WORKFLOW_RUNS_FOR_A_REPOSITORY 轮询 CI,变绿后再合并。
- 可编写工作流脚本(如 scripts/migrate-batch.ts),通过 composio run --file scripts/migrate-batch.ts -- --batch 3 运行,自动创建 PR 并在 issue 中评论 PR 链接。
- 每个 PR 只做一种转换:绝不把重命名和格式变更混在一起。
- 维护 done.list 记录已迁移文件,让下一批跳过它们。
- 最后一批要跑完整测试套件,即使之前每批只跑了 --changed。
- 先跑 codemod 再手工修改:如果 codemod 漏了 3 个文件,手工修补并在 PR body 中说明。
- 按批次回滚而非全局回滚,每个 PR 都应能干净地 revert。
- 每次合并后验证:rg 'jest\.(mock|fn|spyOn)' | wc -l 应趋近 0,跑 npm test 全量测试,并用 GITHUB_LIST_WORKFLOW_RUNS_FOR_A_REPOSITORY 检查 main 分支的 CI 结论。
- 若 codemod 正则匹配过多,改用基于 AST 的工具(ast-grep、ts-morph)做结构化匹配。
- 若本地测试通过但 CI 失败,对齐 Node/Python 版本,检查 .nvmrc / pyproject.toml。
- 若 PR 太大难以审查,把批次大小减半,维护者不会审查 800 行的 diff。
- 若批次间出现冲突,先 rebase 未合并的批次再合并当前批次,绝不对已合并批次 force-push。
适用边界 · 注意事项
- 不依赖 Composio CLI 或 GitHub/Linear 等外部服务时,无法使用其中的 issue 跟踪与 PR 自动化步骤。
- 改动量很小、单文件或无需分批审查的重构,不值得引入这套批处理流程。
- 没有测试套件或 CI 的项目,无法按「每批变绿再合并」的方式安全验证。