Codex 写 Commit 敢全自动吗?我给 AI 提交加了四道门禁
让 Codex 根据代码差异生成 Commit 说明并不难。真正危险的是把“会写提交说明”误解成“可以自动把当前工作区全部提交”。
一个真实仓库里可能同时存在用户尚未完成的修改、临时调试文件、生成物、敏感配置和另一个任务留下的变更。AI 如果只看到自己的目标,很容易写出一条漂亮的提交说明,却把不属于本次任务的内容一起卷进去。
所以我的结论是:AI 可以自动分析、生成说明和执行门禁,但提交对象必须由证据定义,最终 Commit 仍需要明确授权。
一、Commit 不是一句话,而是一个不可变对象
Git Commit 记录的是一棵树、父提交、作者信息和提交说明。提交说明写得再准确,也不能证明暂存区的文件范围正确。
因此 AI 在准备提交时,至少要分别回答三个问题:
- 工作区里现在有哪些变化;
- 本次任务允许提交哪些变化;
- 暂存区最终实际包含哪些变化。
只有三者能对齐,提交说明才有意义。
二、第一道门:范围审计
第一步不是git add .,而是读取事实:
gitstatus--shortgitdiff--name-statusgitdiff--stat然后建立本次任务的允许清单,例如:
src/orders/service.py tests/test_order_service.py docs/order-idempotency.md暂存时使用明确路径:
gitadd-- src/orders/service.py tests/test_order_service.py docs/order-idempotency.md如果目标文件里混有用户修改,还要继续缩小到具体 hunk,或停止并让用户选择。任务授权的是目标和范围,不是对整个工作区的所有权。
三、第二道门:敏感检查
进入暂存区之前和之后,都应该检查常见风险:
.env、密钥、证书和浏览器状态;- 数据库快照、日志和客户数据;
- 大型生成物、缓存和临时文件;
- 绝对路径、真实域名和内部账号信息;
- 与本次任务无关的重命名或删除。
最重要的是检查“将要提交的内容”,而不是只检查工作区:
gitdiff--cached--name-statusgitdiff--cached--checkgitdiff--cached--cached视角对应即将进入 Commit 的真实快照。AI 生成说明也应该基于它,而不是基于聊天上下文或未暂存差异。
四、第三道门:聚焦测试
测试结果必须和当前暂存内容绑定。正确证据至少包括:
- 执行的命令;
- 退出码;
- 关键输出;
- 对应的暂存差异哈希或文件清单。
例如修改一个订单幂等服务,可以先运行:
python-mpytest tests/test_order_service.py-qpython-mruff check src/orders/service.py tests/test_order_service.py如果测试后又改了文件,旧结果不能继续证明新内容。需要重新检查差异并重跑受影响测试。
这就是“检查点保存事实,不保存幻想”:不能只写一句“测试已通过”,而要留下能够复核的命令、结果和内容对应关系。
五、第四道门:人工确认
AI 可以先生成候选提交说明:
fix: 为订单创建增加幂等保护 - 以业务请求键查询既有订单,避免网络重试产生重复记录 - 在事务内记录请求键与订单映射 - 补充重复请求与并发请求测试 验证:python -m pytest tests/test_order_service.py -q但在执行git commit前,应该把以下信息一次性展示给授权人:
- 分支名;
- 暂存文件清单;
- 差异统计;
- 测试结果;
- 完整提交说明;
- 是否存在未暂存或未跟踪文件。
授权绑定的是这份暂存快照。确认后如果暂存内容变化,必须重新确认。
六、为什么 Git Hook 不能替代全部流程
Git 官方支持在提交执行的不同阶段运行 Hook。pre-commit可以检查暂存内容并以非零状态拒绝提交,commit-msg可以检查提交说明格式。
Hook 很适合做确定性守卫:格式化、静态检查、敏感模式扫描、提交说明规范。但它不知道“本次任务应该改哪些文件”,也无法自动判断某个合法文件是否属于用户的另一项工作。
因此 Hook 是最后一道机械门禁,不是任务范围判断器。
七、提交后还要回读
Commit 成功并不代表范围正确。提交后至少执行:
gitshow--stat--onelineHEADgitshow --name-status--format=fuller HEADgitstatus--short验收问题包括:
- HEAD 是否是刚创建的提交;
- 作者、时间和说明是否正确;
- 文件清单是否与批准范围一致;
- 工作区里用户的其他修改是否仍然保留;
- 是否意外包含敏感文件或生成物。
这一步对应长任务恢复里的“恢复前先侦察现实状态”:不要根据上一条命令的叙述继续推理,要重新读取 Git 的真实对象和工作区状态。
八、一条可复用的证据链
可以把提交准备过程固化为一份 JSON 检查点:
{"branch":"feature/order-idempotency","allowed_paths":["src/orders/service.py","tests/test_order_service.py"],"staged_tree":"<sha256>","tests":[{"command":"python -m pytest tests/test_order_service.py -q","exit_code":0}],"approved":false}AI 每推进一步都更新事实,但不能自己把approved改成true。如果中断恢复,先重新计算暂存快照;哈希不同就让旧授权失效。
九、我的自动化边界
我会让 AI 自动完成:
- 读取状态和差异;
- 建议允许清单;
- 运行敏感检查和聚焦测试;
- 根据暂存差异生成提交说明;
- 提交后回读并形成证据。
我不会默认让 AI 完成:
git add .;- 擅自纳入未知修改;
- 跳过失败测试;
- 未经授权创建 Commit;
- 自动 Push、合并、打 Tag 或发布版本。
参考与验证依据
本文以已锁定版本的 RuyiBookCourse“Codex 长任务 Harness”章节为知识依据,并用 Git 官方文档交叉核对命令语义:Git Hooks、git diff、git status。示例流程只说明可复用的安全边界;真正执行时,允许清单、聚焦测试和授权仍需绑定当前仓库的真实暂存快照。
总结
Codex 写 Commit 可以很高效,但“全自动”不应该等于“全权处理整个仓库”。
更稳妥的方式,是让 AI 把工作区事实、暂存清单、测试证据、提交说明和回读结果串成闭环;让确定性 Hook 拦截机械错误;让人对最终暂存快照做一次明确确认。
当一条 Commit 能证明“为什么改、改了什么、怎么验证、没有卷入什么”,AI 才真正提升了 Git 工作流,而不是只替你写了一段更像样的说明。