目前用codex的主要工作流是:
codex 负责执行修改,修改完成后,再把结果交给 ChatGPT 网页版做一次独立审核。
其实就是一句话:codex负责执行,网页端负责审核与决策。
经常遇到一个问题,网页版提示把修改后的内容发给它,但看着 codex 那个 Review 里显示出的 diff 内容, 又有点着急,因为并不好直接复制。
- 直接从界面里复制出来以后,经常不是标准的 patch 格式,原本 diff 里很重要的
+、-和上下文信息也不太好区分,如果修改只有几行的话,还可以手工核对,补上+、-符号,但数量多了眼睛要看花。 - 试过频繁 commit,人为制造一个明确的 git 边界,然后再比较前后的修改。能用,但为了 Review 一次修改专门创建 commit,就成了“刷绿墙”了。
- 还有直接把修改过的几个文件打包,然后上传到网页版。
这些办法都有一定效果,但每次做到这里,工作流都会被打断。无论是打包,还是复制后完善格式。
有一天我想到,codex 的 UI 既然能够准确显示“这一轮改了什么”,那它总得在某个地方保留上一轮和这一轮的状态。
顺着这个方向找下去,最后发现 codex 留下的 turn diff 相关 git refs:
refs/codex/turn-diffs/checkpoints/
真正需要的是“codex 最后一轮修改”,那就比较最后两个 checkpoint,再把 diff 导出来就行。
最终方案
Mac上,默认使用 zsh。
打开:
~/.zshrc
加入下面这段:
codexpatch() {
local refs
local output
refs=$(git for-each-ref \
--format='%(refname)' \
refs/codex/turn-diffs/checkpoints/ \
| sort -t/ -k7n \
| tail -2)
if [ "$(echo "$refs" | wc -l | tr -d ' ')" -lt 2 ]; then
echo "❌ 找不到两个 Codex turn checkpoints"
return 1
fi
output="${1:-$HOME/Downloads/codex-last-turn-$(date +%Y%m%d-%H%M%S).patch}"
git diff \
"$(echo "$refs" | head -1)" \
"$(echo "$refs" | tail -1)" \
> "$output"
if [ $? -eq 0 ]; then
echo "✅ Patch exported:"
echo "$output"
else
echo "❌ git diff failed"
return 1
fi
}
保存以后执行:
source ~/.zshrc
在 codex 项目目录里,只需要输入:
codexpatch
默认会保存在 Downloads 目录:
~/Downloads/codex-last-turn-20260923-153000.patch
也可以自己指定文件名:
codexpatch review.patch
review.patch 保存在当前目录。
指定完整路径:
codexpatch ~/Downloads/review.patch
这个脚本只解决一个问题:
把 codex 刚刚做完的这一轮修改快速拿出来。
为什么不用 git diff 呢? git diff 看到的是当前工作区的累计修改,从上一次提交开始,codex可能已经修改过好多轮了。而我们要解决的是另一件事:只提取 codex 最后一轮到底改了什么。
工作流
现在工作流是下面这个样子:
codex 执行修改
↓
codexpatch
↓
生成 last-turn.patch
↓
上传 chatGPT 网页版
↓
独立 Review
↓
有问题 → 回 codex 修
没问题 → commit
给网页版时,甚至不需要写很复杂的 Prompt。
相比直接上传完整代码文件,模型更容易把注意力集中在“这次发生了什么变化”上。