使用 Codex 处理大型项目时,最让开发者紧张的情况之一,不是它不会修改代码,而是一下改得太多

一个看似普通的需求:

把旧的用户权限逻辑统一重构一下。

执行结束后,Git 里可能突然出现:

  • 28个文件被修改;

  • 6个公共类型发生变化;

  • 3个模块被移动;

  • 新增多个工具函数;

  • 测试文件大量调整;

  • package.json和锁文件也发生变化。

代码可能可以运行,但此时已经很难回答一个关键问题:

这些修改真的全部必要吗?

对于大型仓库,Codex最重要的能力不是“一次修改更多文件”,而是能够在明确边界内完成可审查、可测试、可回滚的变更。

这时可以给每个任务设置一个“变更预算”。

一、什么是变更预算?

变更预算可以理解为:在任务开始前,先限定本轮最多允许产生多大的改动。

例如:

本轮变更预算:

最多修改:5个文件
最多新增:2个文件
禁止删除:任何现有文件
禁止新增:第三方依赖
禁止修改:数据库结构

它不是绝对的技术限制,而是一种工程约束。

目的很简单:

当Codex发现任务需要超过预算时,先停止扩张,重新解释原因。

例如可以直接写:

当前任务最多允许修改5个文件。

如果你判断必须超过5个文件,
先停止修改并输出:

1. 为什么当前预算不够;
2. 额外需要修改哪些文件;
3. 每个文件的必要性;
4. 是否可以拆成下一阶段。

这样就不会出现一个小问题演变成全项目重构。

二、为什么大型重构最容易失控?

大型项目中的代码通常存在大量隐式关系。

例如修改:

User

可能继续影响:

UserService
UserController
UserRepository
UserDTO
UserPermissions
UserStore
UserPage
UserTests

Codex发现这些关联后,很容易继续向外扩展。

然后又发现:

UserPermissions

被订单、后台和报表模块引用。

任务范围就可能从:

用户模块

逐渐变成:

用户
+
权限
+
订单
+
后台
+
报表
+
公共类型

从局部逻辑看,每一步都有理由。

但从项目管理角度看,这已经不是原来的任务。

所以大型重构一定要区分:

必要修改

顺便可以优化的修改

两者不能混在一轮中。

三、第一轮只做“变更地图”

面对复杂任务,不要直接让Codex开始重构。

第一轮只让它生成变更地图:

当前目标:
统一用户权限判断。

暂时不要修改代码。

请输出:

1. 直接相关文件;
2. 间接受影响文件;
3. 公共模块;
4. 风险最高的文件;
5. 可以暂时不修改的内容。

结果可能是:

直接相关:
- src/auth/permission.ts
- src/store/user.ts
- src/router/guard.ts

间接影响:
- src/pages/admin/*
- src/components/PermissionButton.tsx

暂不修改:
- order
- report
- database

然后人为确认:

本轮只处理前三个直接相关文件。

这比让 Codex 自己决定完整重构范围安全得多。

四、给文件划分三个等级

可以把文件分成三类。

A类:本轮必须修改

不修改就无法完成当前任务。

例如:

permission.ts
router.ts
userStore.ts

B类:可能受到影响

需要验证,但不一定修改。

例如:

AdminPage.tsx
PermissionButton.tsx

C类:禁止扩展

即使发现潜在问题,本轮也不处理。

例如:

order/
report/
database/

任务提示可以写成:

A类文件允许修改。

B类文件只检查,不主动修改。

C类目录禁止修改。

如果B类确实必须调整,
请先说明原因。

这样可以把Codex的行为从“自由重构”变成“受控变更”。

五、一个大重构拆成多个可验证阶段

假设要把旧权限系统替换成新的权限模型。

不要一次完成:

旧权限删除
+
新权限实现
+
所有页面迁移
+
测试更新

可以拆成四轮。

第一阶段:建立新能力

增加新权限函数,但暂时不删除旧逻辑。

目标是:

新代码可以运行
旧代码不受影响

第二阶段:迁移一个调用方

例如只迁移后台管理页面。

验证:

  • 新权限结果正确;

  • 旧页面不受影响;

  • 测试通过。

第三阶段:逐步迁移其他调用方

每次只处理一个模块。

第四阶段:删除旧实现

只有确认所有引用都迁移完成后,再清理旧代码。

这种方式虽然提交次数更多,但每一步都可以单独回滚。

六、每一阶段都设置检查点

Codex完成一阶段后,不要直接进入下一步。

先生成检查点:

阶段1完成情况:

修改文件:
3个

新增文件:
1个

测试:
全部通过

旧接口:
仍然保留

公共行为:
未改变

下一阶段:
迁移admin模块

然后执行:

git diff --stat
git diff

确认差异符合预期,再创建提交:

git add .
git commit -m "refactor: introduce new permission evaluator"

这个提交就是一个安全检查点。

如果第二阶段失败,可以回到这里继续,而不是重新处理整个重构。

七、限制单次Git Diff规模

除了文件数量,还可以限制代码行数。

例如:

单轮目标:
Git Diff尽量控制在300行以内。

当然,这不是严格标准。

但如果一个小功能突然出现:

+1800
-1200

就应该重新检查:

  • 是否发生全局格式化;

  • 是否移动了大量代码;

  • 是否重复生成类型;

  • 是否修改了任务无关文件;

  • 是否应该拆成多个提交。

Diff越大,人工审查发现问题的概率通常越低。

尤其不要把:

重构
+
格式化
+
依赖升级

放进同一次修改。

八、公共类型修改必须单独计算预算

例如修改:

interface User {
  id: number;
  name: string;
}

增加:

permissions: string[];

看起来只增加一行。

但这个类型可能被几十个模块引用。

因此,公共类型的“实际变更成本”不能只按一行代码计算。

可以建立规则:

修改公共类型前:

1. 搜索所有引用;
2. 统计受影响模块;
3. 判断是否属于破坏性变化;
4. 优先新增可选字段;
5. 单独建立提交。

例如:

permissions?: string[];

可能比直接改成强制字段更容易逐步迁移。

九、不要让Codex一次性“清理所有旧代码”

AI很容易发现:

这个函数已经不用了
那个接口可以删除
这个文件可以合并

但大型项目中存在:

  • 动态导入;

  • 配置引用;

  • CLI入口;

  • 测试夹具;

  • 外部系统调用;

  • 旧版本兼容逻辑。

所以“搜索不到直接引用”并不一定等于“可以安全删除”。

删除文件前,可以要求:

不要直接删除。

先检查:

1. 静态引用;
2. 动态引用;
3. 配置文件;
4. 测试;
5. 构建脚本;
6. 外部入口。

确认后只输出删除候选清单。

删除操作最好单独作为一个阶段。

十、为重构建立“禁止顺手优化”规则

这是非常实用的一条规则:

当前任务只解决既定目标。

发现以下内容时只记录,不修改:

- 命名不统一;
- 格式问题;
- 性能优化机会;
- 无关重复代码;
- 其他潜在Bug。

可以让 Codex 输出:

额外发现:

1. order模块存在重复查询
2. report模块类型定义重复
3. utils中存在旧函数

本轮处理:
全部不修改

这些问题可以进入后续任务。

这样能避免一次重构无限扩张。

十一、让Codex在执行前重新确认预算

修改前最后增加一道检查:

当前批准预算:

允许修改:
4个文件

允许新增:
1个文件

禁止:
新增依赖
删除文件
修改数据库
修改公共API

请先确认你的修改计划是否符合预算。

如果不符合,不要开始执行。

这一步看似重复,但大型项目中非常有价值。

因为分析阶段和真正实现阶段,Codex可能发现新的依赖关系。

再次确认可以防止任务悄悄扩大。

十二、自动测试也要遵循变更范围

如果本轮只修改:

auth
router
store

第一轮测试应该优先执行:

auth tests
router tests
store tests

然后再运行完整测试:

npm run test
npm run type-check
npm run build

如果修改公共模块,则需要额外验证所有引用方。

变更预算不仅约束修改,也帮助决定测试预算。

修改范围越大,需要运行的回归验证就越多。

十三、把“变更预算”写进AGENTS.md

长期项目可以增加:

# Codex变更预算

- 一个任务只解决一个核心目标
- 默认单轮最多修改5个文件
- 超出范围必须先解释原因
- 公共类型修改需要单独评估引用
- 不进行无关全局格式化
- 不顺手修改其他潜在问题
- 删除文件必须先输出引用检查
- 大型重构必须拆成多个阶段
- 每阶段完成后生成任务摘要
- 每阶段必须建立可回滚检查点

对于大型仓库,这类规则比单纯写“不要乱改代码”有效得多。

十四、一个完整的大型重构流程

推荐采用:

确定目标
↓
生成变更地图
↓
划分A/B/C文件
↓
设置变更预算
↓
执行第一阶段
↓
检查Git Diff
↓
运行测试
↓
创建Git检查点
↓
进入下一阶段
↓
最终全量回归

整个过程中,每次修改都应该回答:

为什么改?
必须现在改吗?
影响谁?
能否单独回滚?

只要其中一个问题回答不清楚,就不应该继续扩大范围。

十五、Plus还是Pro?

如果日常任务主要是:

  • 3—5个文件的小型重构;

  • 单模块Bug修复;

  • 中小型项目;

  • 每轮修改范围明确;

Plus通常已经可以很好地完成这类工作。

如果长期需要:

  • 完整仓库重构;

  • 一次涉及多个模块;

  • 需要连续多轮分析和验证;

  • 大量Git Diff审查;

  • 多阶段测试;

  • 多项目并行开发;

可以根据实际任务连续性评估Pro。

Pro更适合高强度长任务,但不代表应该提高单次修改范围。

实际上,大型项目即使拥有更充足的使用空间,也更应该限制每轮变更预算。

总结

Codex一次修改几十个文件,真正的问题不是“文件数量太多”,而是开发者失去了对修改边界的控制。

通过变更地图、A/B/C文件分类、单轮预算、阶段化重构、Git检查点和禁止顺手优化,可以把一个巨大重构拆成多个可理解、可验证和可回滚的小任务。

真正可靠的AI重构,不是一次把整个项目改完,而是每一步都清楚知道:

当前改了什么、为什么要改、影响哪些地方,以及如果结果不对应该回到哪里。

CSDN文章描述

本文介绍Codex进行大型项目重构时的“变更预算”方法,通过文件范围限制、分阶段修改、Git Diff检查、检查点和AGENTS.md规则,避免AI一次修改过多文件导致代码审查和回滚困难。

更多推荐