Codex 桌面端 Terminal 打不开:不是 PTY,是 Git 签不了 Xcode 协议

一次把「UI 桥接卡住」修成「sudo xcodebuild -license accept」的排查

September 16, 2026·2 min read·Yimin
#Codex#ChatGPT#Xcode#Git#macOS#排查

Terminal 请求一直 queued,后台命令却能跑。看起来像桌面端 bug,根因其实是 GUI 进程里的 /usr/bin/git 被 Xcode 协议挡住了。

问题现象

Codex 桌面端(ChatGPT.app)里,当前任务打不开内置 terminal:

  • 打开 terminal 的请求一直停在 queued,没有真正创建 session
  • 读取当前聊天绑定的 terminal 失败:没有附着任何 app terminal session
  • 后台进程和命令执行本身正常
  • 彻底退出再打开(⌘Q)仍然复现

这和公开的桌面端问题很像:内置终端无法附着,持续返回 queued。第一反应会去查 UI / PTY 桥接。这次不是。

排查

先看桌面端当天日志 ~/Library/Logs/com.openai.codex/。创建 terminal 前后反复出现:

Git is unavailable
Failed to apply worktree shell environment config

open_in_codex 表面上 success=true,随后 read_thread_terminal 立刻 success=false。也就是:排队成功了,PTY 没起来。

再看 ChatGPT 主进程环境:

PATH=/usr/bin:/bin:/usr/sbin:/sbin

GUI 应用拿不到 Homebrew 的 PATH,只能用到 /usr/bin/git。本机也没有独立的 Homebrew git,没有 Command Line Tools 收据。

直接跑:

/usr/bin/git --version

得到的不是版本号,而是整份 Xcode and Apple SDKs Agreement,退出码 69

You have not agreed to the Xcode license agreements.

昨天的 Codex 日志里还没有 Git is unavailable,今天凌晨才开始刷。对照 Xcode.app 的修改时间:Xcode 27.0 在当天 01:03 写进 /Applications/Xcode.app。时间线对上了。

根因

/usr/bin/git 不是一份独立 git,是 Apple 的 Xcode 工具入口。用它等于在用 Xcode / Apple SDKs,必须先同意开发者协议。

Xcode 大版本更新后,旧的同意作废。ChatGPT.app 的 PATH 又短,找不到别的 git。Codex 创建内置 terminal 时会查 git / worktree 环境——这步本该是可选的,失败却被当成致命错误:PTY 还没 spawn,terminal snapshot 就被删掉。于是 UI 一直 queued

同类机制在桌面端的其他环境里也出现过:git 查询失败会在 node-pty 启动前把 session 清掉。

所以:

  1. 夜里 Xcode 升到 27.0
  2. /usr/bin/git 开始要求重新签协议
  3. Codex 把 Git is unavailable 当成 terminal 创建失败
  4. 重启 App 没用,因为 git 还是坏的

修复

不要在协议翻页器里提前打 agreePress enter to display the license: 只是开始显示全文,真正确认是最后的 [agree, cancel],而且必须是 root。跳过翻页:

sudo xcodebuild -license accept

然后验证:

/usr/bin/git --version

正常应类似:

git version 2.54.0 (Apple Git-157)

⌘Q 彻底退出 ChatGPT,重新打开 Codex,terminal 就能创建。

交互版 sudo xcodebuild -license 也可以,但要翻完整份协议,最后输入 agree。没有 sudo 的 agree 不会生效,git 仍是 69。

这不是半年一次

协议不会按日历自动过期。复发点通常是:

  • Xcode 大版本更新(一年一两次很常见)
  • Mac App Store 自动更新,夜里把 Xcode 升完
  • 偶尔 macOS 大更新带着新的开发者协议

这次协议编号是 EA2002。签完之后,/Library/Preferences/com.apple.dt.Xcode.plist 的时间就是同意时刻。

下次再看到 /usr/bin/git 弹出整份协议,多半又是 Xcode 刚更新。GUI 应用签不了这份协议,必须在 Terminal 里用管理员权限签一次。

小结

桌面端 terminal 打不开,不一定是 PTY 或 UI 桥接。先看 Codex 日志有没有 Git is unavailable,再在同一个短 PATH 下跑 /usr/bin/git --version。如果弹出 Xcode 协议,sudo xcodebuild -license accept 比重启 App 有效得多。