2026-05-19HexSaga

怎么让 AI Agent 不把仓库改坏

使用 AI agent 修改真实仓库时,如何通过分支、worktree、测试、权限审批和脏工作区检查,降低误删、混改、破坏配置和污染主分支的风险。

怎么让 AI Agent 不把仓库改坏

AI agent 最大的价值,是它能进入真实仓库完成工作。它会读文件、改文件、跑命令、根据失败继续修。它最大的风险,也正是它能进入真实仓库完成工作。

如果没有边界,agent 可能把无关文件一起改了,可能回退别人的未提交改动,可能执行一个看似清理环境但实际删除数据的命令,也可能在主分支上留下一个难以解释的混合 diff。

让 AI 不把仓库改坏,不是靠提醒它“仔细一点”。要靠流程和权限。

先看工作区,不要一上来就改

每次让 agent 动手前,都应该先看工作区状态:

git status
git diff --stat

这一步不是形式。它能回答几个很重要的问题:

  • 当前是不是在正确分支。
  • 有没有未提交文件。
  • 这些改动是不是本次任务相关。
  • 有没有生成文件、配置文件、锁文件已经变化。
  • 有没有其他人或其他 agent 正在同一个目录工作。

如果工作区已经脏了,不要让 AI 直接“清理一下”。清理可能意味着删除你还没保存的东西。更稳的做法是确认哪些改动属于谁,当前任务是否应该换到新分支或新 worktree 里做。

分支解决版本边界,worktree 解决目录边界

分支是最低要求。真实项目里,agent 不应该直接在 main 或长期开发分支上自由修改。

但在多人、多 agent、多个任务并行时,单纯分支还不够。因为同一个工作目录里仍然可能有未提交文件、构建产物、本地配置和其他任务的临时改动。

这时 git worktree 很有用。它可以从同一个仓库创建一个新的工作目录,让 agent 在隔离目录里做任务:

git worktree add ../repo-task-fix origin/main -b fix/user-export-permission

这样可以把风险隔离在目录层面:

  • 当前任务有自己的文件系统视图。
  • 不会覆盖原目录里的未提交改动。
  • diff 更容易审查。
  • 做错了可以删除整个 worktree,而不是清理一个混乱工作区。

不是每个小任务都必须开 worktree。改一篇文章、修一个局部测试,在干净分支上也可以。但只要仓库脏、任务风险高、多人并行,worktree 就比“相信 agent 不会碰错”可靠。

不要让 agent 自动回退未知改动

最危险的命令不一定看起来危险。

例如:

git checkout -- .
git restore .
git reset --hard

这些命令常被用来“恢复干净”。但如果工作区里有你、同事或其他 agent 的未提交改动,它们就会直接把这些改动丢掉。

所以规则应该很明确:agent 不能回退它没有创建、也没有被明确授权回退的文件。

如果它发现无关改动,正确行为是报告:

工作区里有这些与任务无关的修改:
- ...

我会忽略它们,只改本次任务文件。

这条规则看起来保守,但在真实仓库里非常重要。很多事故不是 AI 写错逻辑,而是它为了“整理环境”把别人的工作清掉了。

权限审批要按破坏性分级

不是所有命令都应该同等对待。

通常可以允许 agent 自己运行的命令包括:

  • rglssed 这类读取命令。
  • git statusgit diff 这类状态命令。
  • 项目约定的测试、构建、lint 命令。

需要确认的命令包括:

  • 删除文件或目录。
  • 重写 Git 历史。
  • 强推远程分支。
  • 删除 Docker volume、数据库、缓存数据。
  • 安装未知脚本或全局工具。
  • 修改生产环境配置。
  • 上传日志、数据库 dump 或包含密钥的文件。

判断标准很直接:如果命令执行错了,会不会丢数据、丢提交、影响别人、影响生产环境?如果会,就必须停下来确认。

这不是不信任 AI,而是把操作风险和读写风险分开。读代码和删数据不应该共用同一套默认权限。

测试要匹配风险,不要只跑最快的

agent 很容易倾向于跑最快、最容易成功的检查。比如只跑格式化,或者只跑一个类型检查,然后说“验证通过”。

真实项目里,验证强度要和风险匹配:

  • 文档和文章:构建或 MDX 编译通常就够。
  • UI 展示:组件测试、页面构建、必要时打开页面看。
  • 业务逻辑:相关单元测试和集成测试。
  • 权限和认证:至少覆盖允许、拒绝、缺失绑定、越权访问。
  • 缓存和刷新:验证 mutation 后读路径是否拿到新数据。
  • 数据迁移:本地迁移、回滚路径、幂等性检查。

如果测试跑不了,也要让 agent 明确说明原因。不能把“没有运行”包装成“应该没问题”。

用 diff 管住任务范围

最后一定要看 diff。

重点不是每一行都要吹毛求疵,而是先判断范围有没有失控:

  • 是否只改了允许修改的文件。
  • 是否新增了没必要的依赖。
  • 是否混入格式化大改。
  • 是否改了锁文件、配置文件、生成文件。
  • 是否把本地路径、密钥、调试日志写进去了。
  • 是否删掉了测试或弱化了校验。

如果 diff 大到看不完,不要硬合并。让 agent 拆任务,或者先把不相关改动剥离出去。

关于合并前具体看什么,可以继续读:AI 代码 review 在合并前该看什么

一套实际规则

我更推荐把规则写成短清单,而不是每次临时提醒:

  1. 开始前必须报告 git status
  2. 默认不在主分支改代码。
  3. 脏工作区或并行任务使用新 worktree。
  4. 只修改任务范围内文件。
  5. 不回退未知改动。
  6. 破坏性命令必须确认。
  7. 验证命令要和风险匹配。
  8. 交付时列出改动文件、验证结果和未覆盖风险。

这套规则不会让 AI 变慢太多,但会大幅降低不可逆错误。

如果任务本身还没说清楚,先看:真实项目里的 AI 上下文工程。上下文不清楚时,仓库安全规则只能减少损失,不能保证方向正确。

结论

AI agent 不会因为能力强就自动安全。它越能执行真实命令,越需要真实的工程护栏。

分支和 worktree 隔离工作,权限审批控制危险操作,测试验证行为,diff 暴露事实,脏工作区规则保护别人的改动。

做到这些,agent 才适合进入真实仓库。否则,它只是一个修改速度很快、但边界不清楚的自动化入口。