Codex 写 Commit 敢全自动吗?我给 AI 提交加了四道门禁
2026/8/9 22:35:26 网站建设 项目流程

Codex 写 Commit 敢全自动吗?我给 AI 提交加了四道门禁

让 Codex 根据代码差异生成 Commit 说明并不难。真正危险的是把“会写提交说明”误解成“可以自动把当前工作区全部提交”。

一个真实仓库里可能同时存在用户尚未完成的修改、临时调试文件、生成物、敏感配置和另一个任务留下的变更。AI 如果只看到自己的目标,很容易写出一条漂亮的提交说明,却把不属于本次任务的内容一起卷进去。

所以我的结论是:AI 可以自动分析、生成说明和执行门禁,但提交对象必须由证据定义,最终 Commit 仍需要明确授权。

一、Commit 不是一句话,而是一个不可变对象

Git Commit 记录的是一棵树、父提交、作者信息和提交说明。提交说明写得再准确,也不能证明暂存区的文件范围正确。

因此 AI 在准备提交时,至少要分别回答三个问题:

  1. 工作区里现在有哪些变化;
  2. 本次任务允许提交哪些变化;
  3. 暂存区最终实际包含哪些变化。

只有三者能对齐,提交说明才有意义。

二、第一道门:范围审计

第一步不是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 工作流,而不是只替你写了一段更像样的说明。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询