1. 先把 Commit Graph 弹窗文案抄下来:graph.js 的搜索锚点

GitLens 在私有仓库上弹出的 Commit Graph Pro 升级提示,已经快把每次打开图谱的好心情糟蹋干净了:弹窗文案以 Commit Graph Pro — easily visualize your repository 开头,中间夹一句 Use on privately-hosted repos requires GitLens Pro,结尾还要补一刀 Get 14 days of GitLens Pro for free。点掉后只要切分支或重开窗口,它就可能再冒出来。这个问题的根治点在 GitLens 安装目录下的 dist/webviews/graph.js。让 Codex 去改之前,先用 TaoToken 官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建 API Key,把 Codex 的 Base URL 指到 https://taotoken.net/api,AI 才有稳定的模型通道可用。整条流程不碰授权服务器,也不动 git 仓库数据,只把插件前端里一段你不想要的弹窗逻辑摘掉。

1.1 找到 GitLens 的 dist/webviews/graph.js

VSCode 的插件都装在扩展目录里。Windows 一般是 %USERPROFILE%\.vscode\extensions,macOS 和 Linux 则是 ~/.vscode/extensions。进入这个目录后,找到名字带 eamodio.gitlens 的文件夹,比如我本机的是 eamodio.gitlens-17.4.1,版本号不同目录名也会有差异。继续展开 dist/webviews/,就能看到 graph.js 文件。

如果你装了多个版本的 GitLens,或者之前手动降级过插件,目录里可能存在不止一个 eamodio.gitlens-*。这时别急着改,先用 VSCode 的扩展面板确认当前启用的版本号,再进对应目录,否则改了半天,VSCode 实际加载的还是另一个文件。另外,graph.js 不是给人手读的源码,它经过打包压缩,绝大多数语句挤在同一行里,直接搜文案能搜到,但要理清函数边界就很痛苦。这正是我们接下来把 Codex 叫来干活的原因。

1.2 复制私有仓库弹窗里的完整提示文本

在 VSCode 里打开一个私有仓库,进入源代码管理视图,点开 Commit Graph,弹窗出现后,用鼠标从第一个单词拖到最后一个标点,把整段英文复制下来。为什么强调「完整」:弹窗文案在 graph.js 里通常是以一个长字符串常量存在,搜出来的片段越全,Codex 命中的位置就越精确,不容易误伤其他包含 Pro 字样或 requires 字样的业务代码。

比较省事的做法是只记住两个锚点:开头的 Commit Graph Pro — easily visualize your repository,以及结尾的 Get 14 days of GitLens Pro for free。中间那段 rich commit search、changed file or files 之类的描述可以交给 Codex 在文件里自己匹配。你只需要把从弹窗复制的完整英文原样贴在对话里,作为锚点文本传入,Codex 在压缩代码里反查时就不会搜偏。

1.3 去 TaoToken 创建这把 Codex 要用的 Key

弹窗文案拿到后,下一步是启动 Codex,但 Codex 本身只是个带代码读写能力的命令行工具,能不能干活取决于背后有没有一条稳定的模型通道。这里我用的是 TaoToken 作为统一接入:打开 TaoToken 注册并创建 API Key。创建成功后把 Key 临时存到记事本里,后面导出环境变量时要原样粘贴,不要多复制空格或换行。

这里要分清两个地址:TaoToken 的官网落地页只负责注册、创建 Key、查看模型广场和用量;而真正填进 Codex 配置的接口地址是 https://taotoken.net/api,末尾没有 /v1,也不要带任何 UTM 参数。官网地址和接口地址不能混用,后者一旦写错,Codex 发出的请求会全部落空。

2. 改 ~/.codex/config.toml,让 Codex 走 TaoToken 通道

2.1 config.toml 里的 model_provider 与 base_url

如果还没装 Codex CLI,先用 npm install -g @openai/codex 装好。装完后,Codex 读取的配置文件位于 ~/.codex/config.toml,没有这个文件就手动创建一个。写入以下内容:

model = "YOUR_MODEL_ID"
model_provider = "taotoken"

[model_providers.taotoken]
name = "TaoToken"
base_url = "https://taotoken.net/api"
env_key = "OPENAI_API_KEY"

model 的值不要照抄网上教程里的旧模型名,也不要凭记忆猜。打开 TaoToken 落地页进模型广场,列表里当前展示的模型 ID 才是 Codex 认识的 ID,把那个 ID 填到 model = 后面。base_url 就是接口地址,写成 https://taotoken.net/api,注意不要擅自补成 /v1。env_key 表示 Codex 会从名为 OPENAI_API_KEY 的环境变量里读取密钥,这一步和 Claude Code 的 ANTHROPIC_* 系列变量没有任何关系,别套错。

2.2 导出 OPENAI_API_KEY 并启动 Codex

配置写好后,在终端里执行:

export OPENAI_API_KEY=YOUR_API_KEY
codex

YOUR_API_KEY 是从 TaoToken 控制台创建出来的真实 Key,如果直接原样把 YOUR_API_KEY 这串字面值留在环境变量里,Codex 发起请求时会被识别成无效凭证。Codex 启动后会进入交互式 REPL,出现提示符后,下一步就是把 graph.js 的读取任务丢给它。此时 Codex 会根据 config.toml 里的 provider 信息走 TaoToken 通道,而不会去请求 OpenAI 官方地址。

3. 让 Codex 读 graph.js:弹窗逻辑的定位与补丁审查

3.1 给 Codex 的任务描述长什么样

在 Codex 的交互界面里粘贴下面这段,注意把路径里的版本号换成你本机实际的版本:

读取 ~/.vscode/extensions/eamodio.gitlens-17.4.1/dist/webviews/graph.js。
搜索弹窗文案锚点,锚点文本以 Commit Graph Pro 开头,
包含 Use on privately-hosted repos requires GitLens Pro,
结束于 Get 14 days of GitLens Pro for free。
找到锚点字符串在代码中的引用,向上追踪渲染函数和显隐控制逻辑,
移除弹窗 UI 的创建、展示和相关事件绑定,保留 Commit Graph 图表面板本身。
先说明修改方案,再给出完整补丁。

Codex 会先在 graph.js 里定位这串文案,然后把包含该字符串的函数、调用这个函数的地方、以及触发弹窗显示的事件全部拉出来。因为文件是压缩过的,它返回的函数名可能很简短,比如一个叫 t 的函数,或者一个只有几个字符的变量。不用在名字上纠结,重点看它的处理逻辑是否集中在「弹窗」这条链路上。

如果 Codex 只跟你说「找到了三处引用,建议删除」,先别急着答应,让它把三处引用分别是什么作用讲清楚,再确认要删的部分不涉及 Commit Graph 图谱的提交渲染逻辑。

3.2 审查 diff 的三个重点

Codex 生成补丁后,至少检查三个地方。第一,删除范围是否集中在弹窗相关函数,不要让它顺手把图谱渲染、提交搜索这类核心功能剪掉。第二,是否只删了文案字符串本身,而弹窗容器和显隐控制还在,如果还在,下次触发条件满足时弹窗会变成一个空壳,照样碍眼。第三,是否把鼠标事件、键盘事件、定时器事件都清干净了,否则弹窗不显示,但事件监听还在,重构代码时可能埋雷。

如果改动内容太大,可以让 Codex 改用最小化方案:先只删除 requires GitLens Pro 所在条件分支,把弹窗函数调用的入口注释掉,其他逻辑一律不动。压缩代码里变量名混乱,最容易出的问题就是删多一个括号导致整段语法断裂,所以小步改动比一次性大改更稳。

3.3 备份 graph.js 再让补丁生效

改之前先把原始文件留个备份,这是本地文件操作,不是让 Codex 去改服务器。在终端里执行:

cp ~/.vscode/extensions/eamodio.gitlens-17.4.1/dist/webviews/graph.js ~/.vscode/extensions/eamodio.gitlens-17.4.1/dist/webviews/graph.js.bak

备份后让 Codex 应用补丁,或者把修改后的文件内容手动写回 graph.js。保存文件时确认编码格式和原文件一致,通常是 UTF-8。然后完全退出 VSCode,再重新打开。

4. 保存重启后验证:弹窗没消失时的排查清单

4.1 重启 VSCode 后用私有仓库复测

重启后打开之前触发弹窗的私有仓库,进源代码管理视图,启动 Commit Graph。正常情况下图谱直接渲染出来,切换分支、点击提交、搜索 commit 记录都不会再有 Pro 升级提示。为了确认不是编辑器缓存造成的假象,连续执行两次「重启 VSCode + 打开图谱」操作。如果第二次仍然安静,基本可以确定弹窗逻辑已经从加载产物里消失。

GitLens 后续通过插件市场自动更新时,graph.js 会被新版本覆盖,弹窗大概率跟着回来。这不是配置失效,只是插件文件被还原了。到时候重新跑一遍 3.1 的任务描述即可,不需要改 Codex 的任何配置。

4.2 弹窗还在、白屏、连接失败的分头排查

如果弹窗还在,说明 graph.js 里可能还有第二处弹窗入口。回到 Codex,要求它把 requires GitLens Pro 和 Get 14 days 在文件里出现的所有位置列出来,逐个确认是否已经删除干净。有些版本的 GitLens 会把弹窗文案复制到多个 chunk 文件里,dist/webviews/ 下可能还有其他 graph.*.js,一并检查。

如果 Commit Graph 变成白屏,先对比 graph.js 和 graph.js.bak,确认是不是多删了某个函数调用导致语法断裂。Codex 生成补丁只负责「提供修改建议」,应用后文件是否完整,最终由你本地确认后保存。

如果 Codex 在启动阶段就报连接失败,按下面这张表排查:

现象先检查什么
401 认证失败OPENAI_API_KEY 是否已替换为真实 Key,而不是字面值 YOUR_API_KEY
404 找不到接口base_url 是否多写了 /v1,正确值是 https://taotoken.net/api
model not foundmodel 字段是否与 TaoToken 模型广场当前列表的 ID 完全一致

验证通过后,可以回到 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 的控制台查看这次 Codex 改 graph.js 一共消耗了多少 token。这一步值得做:改插件看着只是几句对话,实际每次让 Codex 重新读取并分析压缩文件都会产生不少输入 token,心里有数之后,后面再让它排查其他插件时就懂得控制对话轮次。

5. 同款锚点排查法:其他插件的横幅弹窗也适用

5.1 一套不只在 GitLens 上有效的排查套路

把这次的经验抽象一下,本质上是「字符串锚点定位法」。VSCode 插件打包后的 js 里,各种提示文案通常以完整字符串保留。不管是 GitLens 的 Pro 弹窗,还是其他插件在更新后塞进来的尝试性横幅、功能推荐浮层,都可以先触发弹窗,复制文案,再让 Codex 以这段文案为起点搜索引用链,找到渲染和事件绑定代码,最后移除并重启验证。

我用 TaoToken 配好 Codex 之后,用同样方法清理过另外两个插件里的功能引导横幅,流程完全没有变化:弹窗文案是锚点,dist 目录下的 js 是搜索范围,Codex 负责生成补丁,保存和重启由本地完成。工具本身不判断该删什么,它只是把「在压缩代码里大海捞针」变成「按图索骥」。

5.2 清理多个插件时:一段稳定的通道比临时额度更省心

清理这类弹窗通常要反复试好几轮。第一次 Codex 可能只删了文案没删触发逻辑,第二次要再让它追查事件绑定,第三次还要处理另一个 chunk 文件。每一轮对话都会消耗 token,如果通道不稳定,聊到一半连接断开,前面分析的上下文全部作废,又得重头读一遍 graph.js。稳定的 API 通道这时候的价值就体现出来了。

如果你也打算把 Codex 当作日常改插件、查报错的主力工具,建议先去 TaoToken 模型对话 用同一把 Key 发一条消息,确认模型 ID 和 Base URL 都没问题;之后长期高频写代码的话,可以打开 Coding Plan 看套餐是否对得上日常消耗;Key 的管理、用量核对都在 控制台 API Keys 完成。

更多推荐