让 AI 在另一个目录里试改:Git worktree 的一套走法
想让 AI 试着修个 bug,又不想把试验补丁混进手头正在写的文件,可以先给它开一个 Git worktree。
两个目录各有自己的工作文件和索引,试改后也方便单独看 diff。不过它们仍然共享仓库数据,worktree 不会限制程序访问其他目录的权限。
在已有提交的项目里开一个试改目录
下面用 Bash 写法,从仓库根目录运行。先看清当前状态,再选一个尚不存在的分支名和目录名:
git status --short
git worktree add -b ai/try-fix ../repo-ai HEAD
git worktree list
git -C ../repo-ai status --short 列表里应该同时出现原目录和 ../repo-ai,新目录最初没有未提交改动。HEAD 指的是已提交版本:原目录里暂存、未暂存和未跟踪的东西都不会自动带过去。任务如果依赖你尚未提交的改动,先选好基线,别直接从这里往下跑。
接着让 AI 工具打开 ../repo-ai。使用 Codex CLI 时,当前文档里的 -C 可以指定起始工作目录。已有安装和认证、并在原目录准备好任务文件后,可以这样传入:
codex -C ../repo-ai exec --sandbox workspace-write - < TASK.md - 表示从 stdin 读任务,workspace-write 允许在工作区写文件;实际权限仍受你的配置和组织策略约束。其他工具就选择同一个新目录作为工作目录。
任务要写到能验收
附件给了一份完整的 TASK.md,配套的是 slug.py 小例子。它要求把连续空白折叠成一个连字符,例如 " Hello World " 变成 "hello-world",同时明确:
只修改 slug.py,不改变现有 test_slug.py。
不引入第三方依赖,不做无关重构。
运行 python3 -B -m unittest -v,报告真实结果。
不提交、不合并、不推送、不操作其他工作目录。
完成后保留未提交补丁供审阅。 自己的项目换成真实文件、问题和测试命令,别把这份 slug 任务直接用于别的仓库。依赖环境也要在新目录按项目要求准备好,原目录的虚拟环境和构建产物不会自动复制过去。
看完补丁,再决定采用
git -C ../repo-ai status --short
git -C ../repo-ai diff HEAD --stat
git -C ../repo-ai diff HEAD
git -C ../repo-ai diff --check HEAD diff HEAD 能看到已暂存和未暂存的已跟踪文件,但看不到普通未跟踪新文件的内容。因此 status 里的 ?? 也要逐个检查,不能只看一张 diff 就认定没有额外改动。
再到新目录运行项目的测试。附件样例的命令是:
cd ../repo-ai
python3 -B -m unittest -v diff --check 检查的是空白错误等问题,不是业务测试。测试通过、补丁看过以后,再按你原有的提交和代码审阅流程决定是否采用;这里不自动合并回原分支。
不用这个 worktree、并且里面的改动已妥善保留或处理后,回到原目录执行。如果刚才只切到试改目录,可以用 cd - 返回:
git worktree remove ../repo-ai 如果 Git 提示还有未提交改动,先停下来确认要保留什么,不用强制删除来消掉提示。正常移除工作目录后,试验分支仍然保留。
先用演示包走一遍
解压后在解压目录运行:
python3 verify_worktree.py 成功时输出 PASS worktree fixture,退出码为 0,并写出 verification.json。这次验证实际执行了 27 条命令和 14 项状态检查。
这个程序只在新建的临时仓库中操作,不需要 AI 账号。它先记录缺陷版本测试失败,再用已知的一行实现模拟修复,检查测试通过、原目录文件和本地改动保留、未提交状态下移除被拒绝,最后在临时分支提交演示补丁并干净移除 worktree。不会在你当前项目里自动建分支或提交。
演示包已实际解压运行验证,环境是 Git 2.52.0、Python 3.12.14。这里验证的是 Git 操作流程和本地样例,没有调用模型验证修复能力。ZIP 根目录的 slug.py 故意留着缺陷,直接对它跑测试会失败,成功路径是上面的验证程序。
参考:Git 官方 worktree、diff 手册;OpenAI Codex CLI 参数与非交互模式文档,2026 年 10 月 21 日核对。