最近我发现一个挺有意思的事儿,我用Codex用了大概两三个月,有一天心血来潮去看了一下用户目录下那个.codex文件夹,你猜多大?
哈哈,让我猜猜……几百MB?
没那么夸张,但光一个日志文件就17MB了。关键是这东西只增不减,OpenAI到现在都没给一个删除对话或者清理缓存的功能。
对,这其实跟Codex的工作方式有关。它不是简单的代码补全工具,它是以代理模式运行的——每次你给它一个指令,它会在沙箱里执行多步操作,产生一个完整的会话。这个会话里包含你的指令、AI的推理过程、代码变更记录、执行日志,全都存在本地。而且它用的是SQLite数据库加文件系统混合存储,每次代理执行的完整轨迹都会记录下来,所以数据增长速度远超普通应用的缓存。
嗯,所以今天咱们就来聊聊怎么给这个文件夹瘦身。我看社区已经有人做了一些不错的工具了。不过在开始之前,我得先强调一点——操作前一定要备份。
这个必须的。把.codex文件夹整个复制一份到别的地方,标个日期。万一操作出了问题,直接把备份复制回去就行,无缝恢复。另外还需要确认一下本地有Python环境,3.9以上版本就行。
好,准备工作做完了,咱们先说第一个核心操作——删除指定的对话。这个社区工具是怎么用的?
其实很直观。你在GitHub上下载那个社区工具,然后打开命令行,进入工具目录,执行查询命令,它就会把你本地所有的Codex对话列出来,按时间分组,每条对话有ID、标题、日期这些信息。找到你想删的对话,复制它的Session ID就行。
然后就直接删?
不是,这里有个特别好的设计——它支持Dry Run,就是干运行模式。你先执行一个预览命令,工具会告诉你它将要删除哪些文件、涉及哪些数据库记录,但不会真正动手。确认没问题了,再执行正式删除。
Dry Run这个概念其实在很多工具里都有,比如rsync、Terraform的plan命令,本质上就是先让你看看会发生什么,再决定要不要做。这种两步式操作在处理不可逆操作的时候特别重要。
没错,防御性编程的理念嘛。尤其是删数据这种事,多一步确认总比事后后悔强。如果要批量删多条对话,就重复这个流程,换不同的Session ID就行。
我还看到有人提到可以通过Codex的Scales功能来删,直接用自然语言说'把某个日期之前的对话全删了',这个靠谱吗?
Scales本质上是Codex的一种可扩展能力机制,有点像ChatGPT的Function Calling。你用自然语言描述意图,AI解析后去调用外部脚本。听起来很方便对吧?但问题是AI在理解指令的时候可能有偏差,比如日期边界怎么算、对话范围怎么界定,这些都可能跟你想的不一样。所以如果是重要场景,我还是推荐用命令行手动操作,精准度是100%的。
明白了。那对话删完之后,我发现文件夹好像也没小多少啊?
哈,这就是很多人踩的坑。真正的体积大户其实是logs.sqlite这个日志文件。你用SQLite工具打开看看,里面可能有上万条记录,全是debug、info级别的运行时日志。这些东西是给开发者调试用的,对咱们普通用户来说完全没用。
那这个日志文件怎么清理?能直接删吗?
可以,但有个关键前提——必须先把Codex完全关掉。因为SQLite在被进程使用时会有WAL日志锁定机制,你强行删可能导致数据损坏。关掉Codex之后,直接把logs.sqlite删了,然后重新打开Codex,它会自动重建这个文件。
重建之后有多大?
大概41KB。之前是17MB,直接从1700万字节缩到十几万,瘦身效果非常夸张。而且你的对话内容、消息记录全都完整保留,第一次打开可能稍微慢一点,第二次就恢复正常了。
等一下,你刚才说SQLite删除数据后文件大小不会自动缩小?那为什么不用VACUUM命令来清空表,而是直接删文件呢?
问得好。SQLite确实有这个特性,删除数据后空间会被标记为空闲页,留着以后复用,文件本身不会变小。你当然可以清空表再VACUUM,但既然这些日志全都不需要,直接删文件让程序重建反而更干净更彻底。而且Codex目前没有日志轮转机制,就是说它不会自动归档旧日志创建新文件,所以这个日志只会越长越大。
这就解释了为什么用久了文件夹会膨胀得那么厉害。那除了这两个核心操作,还有什么长期维护的建议吗?
我建议每一到两个月做一次彻底归档。具体做法是:把整个.codex文件夹复制到归档目录,加上日期标号,然后清空原文件夹,只保留auth和config两个配置文件。auth存的是你的API认证令牌,config是个性化设置,这两个是Codex启动的最小必要条件。其余的会话数据、日志、缓存都是可再生的。重新打开Codex它就会自动初始化,你就得到一个全新的干净环境。
这有点像Docker的system prune或者Git的垃圾回收,定期清理防止环境熵增。
对,而且AI代理产生的数据量远超传统开发工具,养成这种环境卫生习惯真的很有必要。
好,那咱们最后总结一下。整个清理其实就两步:第一步用社区Python工具通过Session ID精准删对话,记得先Dry Run再正式删;第二步关掉Codex直接删logs.sqlite,重启自动重建。再加上定期归档的习惯,基本就能把.codex文件夹管理得很好了。建议大家现在就去看看自己的.codex文件夹,说不定它已经偷偷长到让你吃惊的大小了。