Codex 的本地历史记录默认会长期保留,但这并不代表所有内容都能一直在界面中正常查看。受 SQLite 数据库状态、索引完整性以及渲染泄漏等因素影响,一些较早的会话可能会在界面里“消失”,但实际上仍然占用本地磁盘空间。清理之前,建议先使用 codex-history doctor 检查数据结构,再按照 list → purge → purge-orphans 的顺序执行,更适合安全、稳妥地整理 Codex 历史任务。

Codex 历史任务通常不会自动过期或自动删除,本地保存的会话数据只要没有被手动清理,或未受到相关工具干预,理论上都会持续保留。不过,历史记录是否还能正常访问,仍会受到 SQLite 数据库状态、索引是否完整以及渲染泄漏等问题影响,因此部分旧会话可能在界面中看不到,但依旧会继续占用磁盘存储空间。
本地历史默认永久保存,但不等于“始终可用”
Codex 本地会话通常以 SQLite 数据库形式存储在 ~/.codex 目录下,只要相关文件没有被删除、移动或损坏,从物理层面看,历史任务一般都还存在。不过,随着使用时间增加,数据库体积会不断膨胀,可能引发索引碎片、查询效率下降,甚至部分会话无法正常加载。因此,很多用户看到“Codex 历史记录不见了”,并不一定是真的被删除,更常见的情况是数据库已经无法顺利查询出来。
执行 codex-history doctor 可以检查当前本地数据结构是否完整、是否仍在工具支持范围内;如果返回 “structure unsupported”,通常说明本地存储结构已经偏离支持标准,后续的 list 或 purge 命令也可能因此拒绝执行。
三种常见的历史记录失效场景
方法一:SQLite 表损坏或索引缺失
如果 threads 表因异常退出、写入中断等原因导致主键约束丢失,或者索引发生损坏,Codex 在启动时可能会跳过对应 thread 的加载。这样一来,历史任务在界面列表中就不会显示,但对应的 rollout 文件往往仍然保留在本地磁盘中。
方法二:rollout 文件被移出原始路径
Codex 依赖 rollout 文件与 SQLite 记录之间的双向引用关系。若手动移动、重命名或替换 rollout 文件(例如 019e6885.rollout),即使数据库中仍保留这条历史记录,界面端也无法完整还原该会话内容,用户就会误以为历史任务已经丢失。
第三种情况是内存摘要没有及时更新,导致上下文信息出现断连。即使 thread 与 rollout 文件本身都没有问题,如果 ~/.codex/memories/memory_summary.md 没有按时生成,或者因为内容截断超出限制,新启动的 Codex 也可能无法读取关键上下文信息,最终表现为“知道之前做过这个任务,但无法恢复具体细节”。
安全清理 Codex 历史记录的正确顺序
第一步:运行 codex-history doctor,确认本地历史结构正常且受支持
第二步:使用 codex-history list --grep "关键词" 筛选目标会话,先定位需要清理的历史任务
第三步:执行 codex-history purge 删除指定单条记录,交互式确认后会自动清理 SQLite 记录、rollout 文件以及关联日志
第四步:运行 codex-history purge-orphans 扫描并清除遗留的孤儿数据,释放多余磁盘空间
【purge 操作不可逆,且不会备份 rollout 内容】 该工具只会删除本地文件,不会影响服务端记录,也不会自动生成任何副本。如果你需要保留某次 Codex 会话或历史任务内容,建议提前手动复制对应的 rollout 文件到其他目录进行备份。
