返回技术分享

GitHub CLI 连接不上 API 的排查记录

这次问题的表面现象很迷惑:浏览器里的 GitHub Device Login 已经显示成功,但命令行里的 gh 仍然报错,无法完成认证。

现象

浏览器页面提示 Congratulations, you're all set.,但终端里出现类似错误:

failed to authenticate via web browser:
Post "https://api.github.com/graphql":
dial tcp 20.205.243.168:443: connectex: A connection attempt failed

关键点是:浏览器授权成功,只说明 GitHub 网页端接受了这次设备授权;它不等于 gh 已经成功访问 API 并把 token 写入本机。

排查顺序

  1. 先用 gh auth status 确认 CLI 是否真的登录成功。
  2. 再分别测试 github.comapi.github.com,因为网页能打开不代表 API 能连通。
  3. 检查命令行有没有代理配置:环境变量、Git 代理、WinHTTP 代理。
  4. 查本地是否有代理端口在监听,公开笔记中用 个人的url 代替真实本地代理地址。
gh auth status
curl.exe -I https://github.com
curl.exe -I https://api.github.com
git config --global --get-regexp "^(http|https)\.proxy$"
netsh winhttp show proxy

本次根因

浏览器能打开 GitHub,是因为浏览器有自己的网络通道;但命令行里的 ghcurl 没有自动走同一个代理,所以直连 api.github.com:443 超时。

修复方法

在当前 PowerShell 里先给命令行设置临时代理,再刷新 GitHub CLI 登录:

$env:HTTPS_PROXY='个人的url'
$env:HTTP_PROXY='个人的url'

gh auth refresh -h github.com --reset-scopes
gh auth status

如果是第一次登录,可以改用:

gh auth login --hostname github.com --git-protocol https --web

如果最后提示 hosts.yml: Access is denied,说明 GitHub CLI 没有权限写入本机凭据文件, 需要换一个有写入权限的终端重新执行认证。

以后更新网站

认证和远端仓库配置好之后,日常更新只需要改文件、提交、推送:

git status
git add .
git commit -m "Update site notes"
git push

记住这几个判断

  • 浏览器成功页不等于 gh 登录成功,最终以 gh auth status 为准。
  • github.com 能访问,不代表 api.github.com 能访问。
  • 浏览器会走代理,不代表命令行会自动走代理。
  • 遇到 GitHub CLI 网络问题,先查 API 连通性,再查代理。