一个被忽略的角落:~/.codex 目录

我也是在 Reddit 上看到有人提到才意识到这件事。有人反馈说,他把 ~/.codex 目录下几个文件清理之后,Codex 的推理质量明显回升。底下一连串跟帖:有人 TUI 日志超过了 100GB,有人整个目录从 42GB 清理到 1.3GB。

这背后的逻辑其实不难理解。Codex 在本地会持续写入状态库、日志、会话记录这些东西,时间一长体积失控,读写就开始变慢。整体响应被拖累,给人的直观感受就是"它怎么变笨了"。

我去翻了一下自己的 .codex 目录,果然有几个文件大得不正常。从那之后,定期检查就成了我的习惯。

哪些文件最容易膨胀?

如果你也想排查一下,重点关注这几个:

  • ~/.codex/state_5.sqlite — 本地状态库,存会话上下文
  • ~/.codex/logs_2.sqlite — 本地日志库,积少成多
  • ~/.codex/.codex-global-state.json — 全局状态和设置
  • ~/.codex/log/codex-tui.log — 终端界面日志,最容易疯长
  • ~/.codex/sessions/ — 历史会话目录
  • *.sqlite-wal*.sqlite-shm — SQLite 的预写日志和共享内存文件,有时也会异常变大

这些文件的共同特点是:删掉之后 Codex 会自动重建,所以清理本身是安全的。但也正因为会重建,最好养成定期维护的习惯,别指望一次性搞定。

我的清理流程:保守但完全可逆

直接 rm 当然最痛快,但万一出问题怎么办?我的做法分五步,多花两分钟,换来的是随时可以反悔:

1. 先关掉 Codex,做个备份

完整备份整个 ~/.codex 目录,出任何问题都能直接还原。这一步看起来多余,但它是整个流程能保持"无心理负担"的关键。

2. 看看各个文件的大小

挨个看一遍,通常 codex-tui.log 是体积最大的那个。心里有数之后,再决定动哪几个。

3. 重命名,别直接删

把怀疑影响性能的文件加上 .old 后缀。这样万一清理完感觉不对,把后缀改回来就行,不用从备份恢复。

sessions/ 目录我一般只动那些明确不再需要的旧会话,最近在用的会保留。WAL 和 SHM 文件如果也很大,就同样改名处理。

4. 重启 Codex,跑一跑之前的任务

Codex 会自动生成新的文件。挑一两个之前明显感觉费劲的任务再试一遍,差别一般能立刻感觉出来。

5. 确认稳定后再清理 .old 文件

用几天觉得没问题了,再把那些 .old 文件删掉释放空间。万一觉得还不如之前,把备份目录覆盖回来,完全可逆。

日常维护的小习惯

我现在每隔一两周会把旧状态文件归档一下,保持主目录清爽。归档目录按日期命名,想回滚的时候也能精确找到当时的文件。

但还有一件事更重要——项目里真正重要的长期信息,别全压在 SQLite 里

什么意思?架构决策、不能动的边界、踩过的坑,这些是你希望 Codex 每次都能读到的核心上下文。如果它们只存在于 SQLite 状态库里,那每次清理你都得纠结:清了会不会把重要的东西也清掉?

我的做法是写在项目根目录的 PROJECT.md 里。纯文本,不依赖任何本地状态,Codex 随时能读,清理多少次都不受影响。这样清理 .codex 目录就成了一件没有心理成本的事。

写在最后

这个方法不能保证 Codex 一定恢复如初——毕竟真正的服务端问题该有还是有。但它至少能帮你排除"本地文件膨胀"这个隐性干扰,让你判断问题到底出在哪一层。

如果你也感觉 Codex 时灵时不灵,下次发作之前,不妨先看一眼自己的 ~/.codex 目录。也许真正拖累它的,不是远在云端的模型,而是躺在你硬盘上那个悄悄长到几十 GB 的日志文件。

那么进一步想一下:除了 Codex,你日常用的其他 AI 工具,是不是也在本地默默写着类似的状态文件?