浏览器能打开 GitHub,复制仓库地址到终端,git clone 却一直等,最后报连接超时。先别忙着换节点:浏览器和 Git 可能根本没用同一套代理设置。
下面针对 Windows 上的 HTTPS 仓库地址,按“看设置、试一次、再保存”的顺序排查。你需要先让代理客户端正常运行,并查到它在本机监听的端口。
先看仓库地址是哪一种
https://github.com/用户名/仓库.git 属于本文的范围;git@github.com:用户名/仓库.git 用的是 SSH。给 Git 设置 http.proxy,不能当作 SSH 连接的通用修复办法。
浏览器里能看到仓库,只能说明那次网页访问成功。Git 的代理文档说明,HTTP 访问可以使用终端环境中的代理变量,也能被 Git 配置覆盖。系统代理开关亮着,不能单独证明终端已经走了同一条路。
如果用了 TUN,实际接管还取决于客户端规则;先保留现状,别同时改模式、DNS 和节点,否则很难知道哪一步起了作用。
查清 Git 现在记着什么
已经有本地项目,就在这个项目的终端里执行;还没克隆时,在准备下载的目录执行:
git config --show-origin --get-regexp proxy
它会列出名称里含 proxy 的 Git 配置,并显示来自哪个文件。重点找旧端口、已停用的代理地址,以及项目里的 .git/config。没有输出不等于没有代理,终端的 http_proxy、https_proxy、all_proxy 环境变量仍需另外检查。
再看目标网址匹配到的 HTTP 代理:
git config --get-urlmatch http.proxy https://github.com/git/git.git
示例查的是 Git 公开仓库;排查自己的项目时,把末尾网址换成失败命令里的 HTTPS 地址。这条只查询 Git 配置,不是联网测试,也不会列出环境变量。输出为空可能是没有匹配项,也可能是显式空值,要结合前一条看。截图求助前遮住用户名、个人目录、内部地址和代理认证信息。
先用一次性设置试连接
打开代理客户端设置,找到 HTTP 或混合端口。机场订阅地址、节点服务器端口、客户端的控制面板端口,都不能拿来替代这个本地入口。
假设你已确认 HTTP 入口是 127.0.0.1:7890,可以执行下面的例子。实际端口不同,就先改数字:
git -c http.proxy=http://127.0.0.1:7890 ls-remote https://github.com/git/git.git HEAD
这里访问的是 Git 自身的公开仓库。ls-remote 官方说明定义了它读取远端引用的用途,不会像 clone 那样下载整个项目。成功时应看到一串提交编号和 HEAD;它证明这次引用查询成功,不代表大仓库下载速度也达标。
-c 参数只给当前 Git 命令传入配置,结束后不会把这个值写进配置文件。先这样试,比上来就改所有项目的全局设置更容易判断。
还有一个容易漏的地方:如果第一步发现 http.https://github.com/.proxy 这类按网址设置的代理,普通的 -c http.proxy=... 仍可能不是最终匹配项。先核对具体键和值;不能因为加了 -c,就认定旧设置已经全部失效。
根据报错决定下一步
看到 Failed to connect to 127.0.0.1 port ...,先检查客户端是否运行、端口是否对应 HTTP 入口。它指向的是本机代理连接失败,不能直接据此判断国外节点坏了。
如果仍是超时,记录完整错误、时间和当前端口,再检查客户端日志有没有对应连接。若变成证书错误,先核对系统时间和证书链;不要照抄关闭 sslVerify 的命令。
公开仓库查询成功,自己的私有仓库却失败时,再查账号权限、凭据和仓库地址。如果只有 git pull origin 出问题,还要核对远端专用的 remote.origin.proxy;直接测试公开网址,没有覆盖这类远端设置。
确认有效后再保存
只想让当前已存在的项目使用这个 HTTP 代理,可以在项目目录执行:
git config --local http.proxy http://127.0.0.1:7890
仍要换成自己的实际端口。Git 配置层级说明指出,仓库级设置只作用于当前项目,用户级 --global 则影响该用户的多个项目。若旧教程留下了全局值,别以为改完一个项目就处理了所有地方。
不再需要这次新增的仓库级设置时,可以在同一项目撤销;如果原来已有值,应先记下并恢复原值:
git config --local --unset-all http.proxy
撤销这一项后,全局设置或环境变量可能重新生效,需再查询一次。本文的读取、覆盖和撤销行为已在 Git for Windows 2.55.0 的隔离配置中核对;连接是否成功,则以你实际执行的返回结果为准。