本文只针对 macOS。Windows / Linux 的路径不同,但思路(卸 App → 清用户配置 → 清缓存 → 清钥匙串 / Credential Manager → 重装)是一样的。

问题现象

在 Mac 上的 VSCode 里点 “Sign in with GitHub”,浏览器会跳到 GitHub 的授权页。我在浏览器里已经登录好账号、点了页面上的 “Open Visual Studio Code”,浏览器也确实唤起了 VSCode,但回到 VSCode 之后弹出的不是”登录成功”,而是这个:

You have not yet finished authorizing this extension to use GitHub. Would you like to try a different way? (url handler)

Source: GitHub Authentication

点 Yes 让它换一种方式(device flow、token 之类)也照样过不去,反复试都是同一个弹窗。这个报错很有迷惑性:看名字像是 URL handler 注册有问题,但实际请求一路都打到了 GitHub、浏览器也确实把回调交还给了 VSCode,问题出在 VSCode 本地对回调的接收状态上。

触发原因

回头看,这台 Mac 是台备用机,平时几乎不开。这次开机后我顺手点了 GitHub 账户菜单里的 “Turn on Settings Sync”,把另外一台主力机的配置(settings、keybindings、扩展列表,以及——关键的——一些和身份认证相关的本地状态)拉了下来。Sync 不只是同步用户设置,它还会让本地的认证/会话状态、扩展安装顺序、URL handler 注册顺序进入一个和原机器不完全一致的中间态。在备用机本身就已经装过 Insiders / 旧版本 / Cursor 等同样抢 vscode:// 协议的程序时,这一拉就足以让 GitHub Authentication 扩展拿不回浏览器抛过来的 token。

我试过的”轻量”方案——退出登录重试、删 ~/.vscode 单个扩展目录、改默认浏览器、禁用 Settings Sync、reload window——都没用。最终选择直接走”彻底卸载 + 重装”。

解决方案:在 Mac 上彻底卸掉 VSCode

先说一句最关键的:把 VSCode 从”应用程序”拖到废纸篓,或者用任何”普通卸载”的方式,都不能解决这个问题。原因很直接——这次出错的根本原因是本地状态里某一处被 Sync 污染了,但具体是 Application Support/Code/User 里的某个 JSON、是 HTTPStorages 里的 cookie、是 WebKit 里某个 IndexedDB、是 Saved Application State 里的窗口/会话快照,还是钥匙串里残留的 GitHub OAuth token,无法事先判定,也没有合适的诊断接口可以一个个排除。普通卸载只会删掉 /Applications/Visual Studio Code.app,上面这些”用户域 + 系统域”的脏数据原封不动留在磁盘上,重装回来照样复现报错。所以这里没有捷径,只能一次性把”所有可能保留状态的位置”全部清空,让下一次启动是真正意义上的”全新安装”。

Cmd + Q 完全退出 VSCode(不是关窗口,是退出进程),然后在终端依次执行下面这一段。它会删掉应用本体、所有用户配置、所有扩展、所有缓存、所有日志和应用状态、所有协议/网络相关的本地存储,以及命令行入口 code,不会动你的项目代码(除非你的代码恰好放在这些目录里)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 1. 删 App 本体
rm -rf "/Applications/Visual Studio Code.app"

# 2. 用户数据 + 扩展
rm -rf "$HOME/Library/Application Support/Code"
rm -rf "$HOME/.vscode"

# 3. 缓存 / 日志 / 应用状态
rm -rf "$HOME/Library/Caches/com.microsoft.VSCode"
rm -rf "$HOME/Library/Caches/com.microsoft.VSCode.ShipIt"
rm -rf "$HOME/Library/Logs/Code"
rm -rf "$HOME/Library/Saved Application State/com.microsoft.VSCode.savedState"

# 4. 偏好、HTTP/WebKit 本地存储(URL handler / Cookie / 登录态都在这里)
rm -rf "$HOME/Library/Preferences/com.microsoft.VSCode.plist"
rm -rf "$HOME/Library/HTTPStorages/com.microsoft.VSCode"
rm -rf "$HOME/Library/WebKit/com.microsoft.VSCode"

# 5. 命令行入口
rm -f /usr/local/bin/code
rm -f /opt/homebrew/bin/code

执行到第 5 步如果看到 rm: /usr/local/bin/code: Permission denied,是因为 /usr/local/bin/ 需要管理员权限,加 sudo 再来一次即可:

1
sudo rm -f /usr/local/bin/code

输密码时终端不回显是正常的。删完用 ls -l /usr/local/bin/code 验证显示 No such file or directory 就干净了。这一步其实可有可无——code 只是个软链入口,不影响 App 本身,重装时会覆盖。

钥匙串里的残留要手动清

上面那段命令删的是 VSCode 自己的文件,但 GitHub 登录态还有一份在 macOS 钥匙串(Keychain)里,VSCode 卸了它也不会自动消失。这才是导致重装后仍然”似乎已登录但又失败”的最大祸根。手动清的步骤:打开 钥匙串访问 → 在搜索框依次搜 vscode / Visual Studio Code / GitHub / github.com,把明显属于 VSCode 或 GitHub Authentication 的”密码”类条目删掉。不要碰系统证书或 Apple 自己的条目。

清完钥匙串之后强烈建议重启一次 Mac。macOS 的 URL handler 注册、LaunchServices 数据库、后台 XPC 服务都会缓存一段状态,不重启的话有概率重装后仍然把 vscode:// 回调派发到一个已经不存在的旧实例上。

重装与开 Sync 的顺序

去官网下载 Stable 版重新装,第一次打开后先什么都别同步,按下面顺序来:先登录 GitHub 账户,确认弹出的浏览器授权页能正常回到 VSCode、左下角账号头像变成你本人;然后再考虑打开 Settings Sync,并且打开时建议先不要勾 Extensions,等用一段时间 GitHub 登录稳定不再掉之后再开。

这个顺序的目的是把”登录”和”同步”两件事解耦:登录走的是干净的全新本地状态,不会被任何同步下来的旧 session 干扰;等登录站稳了再打开同步,万一同步又把状态搞乱也能很快定位是 Sync 引入的问题,而不是登录本身。

一个延伸的坑

如果这台 Mac 上同时装过 VSCode Insiders、VSCodium、Cursor 这几个 fork,它们都会注册 vscode:// 或自己的同族协议。LaunchServices 会按”最近注册”的顺序决定谁来接管回调,理论上不冲突,但实践中遇到过 GitHub Authentication 把回调交给了错版本然后报同样的 url handler 错。如果按上面步骤清完仍然有问题,下一步就是检查这些 fork 的 URL handler 注册情况(/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -dump | grep -i vscode),把不需要的版本也卸掉再试。