DEBUG.WIKI
丽萨主机;为跨境业务选好 IP;原生 / 住宅 IP · 按套餐选择;查看 IP →
阿里云;从建站到云上业务;云服务器 · 数据库 · 对象存储;查看产品 →
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

Git HTTPS 克隆报 Could not resolve proxy,清除全局代理后仍失败

Git HTTPS 报代理无法解析时,只清除一个全局键可能无效。追踪配置文件、URL 专用设置、remote 代理和环境变量,再按实际出处修正并核验连接。

通过 HTTPS 克隆仓库时,Git 可能在开始下载前退出:

fatal: unable to access 'https://code.example.com/team/project.git/': Could not resolve proxy: old-proxy

浏览器能打开仓库页面,执行过 git config --global --unset https.proxy 也没有变化。先确认 Git 使用的代理地址从哪里来。报错中的 old-proxy 是代理主机名,不是仓库服务器;检查目标网站的 DNS,未必能解释代理为什么无法解析。

本文处理 Git 自带 HTTP(S) 传输中的代理解析失败。SSH 地址、代理认证失败、连接超时和证书校验失败,需要按各自错误处理。示例域名、代理名和路径均是占位值。

HTTPS 请求也要检查 http.proxy

Git 的 http.proxy 用于 HTTP(S) 传输,并非只对 http:// 地址生效。不要把 Git 配置键 https.proxy 与环境变量 https_proxy 混为一谈:它们属于不同的配置机制。只删除前者,不能保证清除了 Git 实际使用的代理。

此外,--global 只指定用户级配置。系统配置、当前仓库配置、包含进来的文件、URL 专用设置和当前进程的环境变量,都可能仍然提供代理。重复同一条 unset 命令,仍无法判断实际生效的是哪一项。

在报错的同一个终端、同一个工作目录读取配置:

git --version
git config --show-origin --get-regexp "^(http|https)\..*proxy$|^remote\..*\.proxy$"

这会列出相关键值及配置出处。输出可能包含代理账号和密码,只在受控终端查看;对外提供记录时隐藏凭据。没有匹配项时,查询可无输出并返回非零状态,这不意味着 Git 没有从环境读取代理。

这里使用仍兼容的 --get-regexp 等旧式查询语法。较新的 Git 已提供 config get 等子命令;若安装版本不支持 --show-origin,应先使用本机帮助确认可用语法,或升级到受支持版本,再追踪出处,不要根据一份手工打开的文件推断全部配置。

克隆失败时,目标目录可能还没有有效仓库,无需先进入那个目录。对于已有仓库的 fetch 失败,则要在该仓库内查询,否则可能漏掉它自己的配置及条件包含规则。

分清通用设置、URL 设置和 remote 设置

如果结果包含 http.proxy,记下它来自哪个文件;若是类似 http.https://code.example.com/.proxy 的键,它只对匹配 URL 生效。匹配更具体的路径可以优先于更宽泛的地址,因此只看通用键可能漏掉真正的值。

用实际 HTTPS 地址检查匹配结果:

git config --get-urlmatch http.proxy https://code.example.com/team/project.git

这一步检查 Git 的 URL 配置匹配,不负责展示环境变量,也不能代替已有 remote 的专用代理检查。若原命令使用 origin,继续核对:

git remote get-url origin
git config --show-origin --get-all remote.origin.proxy

origin 要替换成实际 remote 名。remote.<name>.proxy 可以覆盖 HTTP 代理设置。get-url 还会展开 URL 重写规则;如果得到的地址与预期不同,应以实际访问地址检查匹配配置,而不是只围绕输入时看见的域名。

不要把正常的公司代理一律当作残留。若当前网络必须使用它,处理方向是核对代理主机名、端口和所需网络连接;只有确认不再需要那条代理时,才考虑移除或禁用。

检查终端继承的代理变量

Git 配置没有代理,仍可能从环境获得 https_proxy、HTTPS_PROXY、all_proxy 或 ALL_PROXY。HTTP 请求还要检查小写 http_proxy;不要假定大小写写法在所有协议下都等效。

以下命令适用于 Bash,包括 Linux、macOS 终端中的 Bash 和 Windows Git Bash;它只报告变量是否存在,不打印内容:

for name in http_proxy https_proxy all_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY; do
  if printenv "$name" >/dev/null; then
    printf '%s is set\n' "$name"
  fi
done

“已设置”并不代表一定生效,还要结合协议、Git 配置和代理排除规则判断。浏览器、IDE、Git Bash 和 Windows CMD 也不一定继承同一份环境。在系统设置中删除变量后,已经打开的终端或 IDE 可能仍保留旧环境,需要从更新后的父进程重新启动再检查。

若已确认 Git 配置没有有效代理,且当前网络允许直连,可以用子 Shell 临时排除这些环境变量,再尝试只读取远端引用:

(
  unset http_proxy https_proxy all_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY
  git ls-remote https://code.example.com/team/project.git HEAD
)

括号内的 unset 不会清除外层终端的变量。这段仅适用于 Bash 等支持该语法的 Shell,不要原样粘贴进 CMD 或 PowerShell。它也不会清除 Git 配置里的代理;若仍显示同一个代理名,继续查配置出处、启动包装脚本或 IDE 注入的参数。

已有 remote 可先做一次临时直连对照

对于已有仓库,确认允许直连后,可临时禁用指定 remote 的代理:

git -c remote.origin.proxy= ls-remote origin HEAD

末尾的等号必须保留,表示把这个配置值设为空字符串。该设置只作用于这次 Git 命令,不会写入配置文件。它针对已有的 origin,不适用于尚未建立该 remote 的克隆目录。

如果原命令报代理无法解析,而这次能列出远端引用,说明直接访问路径可用,原来的代理选择值得继续修正。如果错误变为目标主机无法解析、连接失败或认证失败,只能说明故障阶段变了,不能宣称仓库访问已经恢复。

只修改已经确认的出处

永久调整前,备份实际配置文件并记录原值。若明确确认失效项就是用户级普通 http.proxy,并且同名值都应移除,才执行:

git config --global --unset-all http.proxy

如果值来自仓库本地、系统级或 include 文件,不能照搬这条命令。应修改查询结果标出的文件及准确键名;系统级策略由管理员维护,包含文件也不要误当成主配置的一部分去覆盖。不要删除整份 .gitconfig,里面可能还有身份、签名及其他正常设置。

“删除值”和“把值设为空”也有区别:删除某一层后,其他层或环境中的代理可能重新生效。已有仓库若确定只有这一个 remote 应直连,可有意设置本地空值:

git config --local remote.origin.proxy ""

这会持续禁用该仓库中 origin 的代理。若原来已有本地值,需要保存它以便恢复;若原来没有这项,回退时删除新加的键即可:

git config --local --unset-all remote.origin.proxy

如果问题来自环境变量,应修正真正设置它的启动文件、系统用户环境或 IDE 启动配置,而不是每次开终端手动清空。需要代理的其他工具可能共用这些变量,变更前应确认影响范围。

用原来的入口复查

调整后,在原来报错的终端或 IDE 中重试相同 HTTPS 地址。可先运行 git ls-remote 检查远端通信,再进行正常克隆或 fetch。对于空仓库,没有 HEAD 行不一定表示通信失败,应同时查看退出状态和错误输出。

修复标准是原来的代理解析错误消失,且所需仓库操作实际成功;一次临时直连成功并不代表持久配置已经改对。整个处理不需要关闭 http.sslVerify,也不需要用 reset、强制推送或删除本地提交来修复网络代理。