git 拉代码有两条互不相干的路:仓库地址以 https:// 开头,走 HTTP 通道,代理由 http.proxy 或 https_proxy 环境变量管;地址是 git@host:... 的形式,走 SSH,代理要在 ~/.ssh/config 里用 ProxyCommand 配。很多人"配了没用"都是因为配错了那一条。本文基于 2026 年 11 月的 git 行为。
先分清:你的仓库走的是哪条路?
看一眼 git remote -v 就知道。https:// 开头的由 git 内置的 libcurl 发请求,git@ 或 ssh:// 开头的则交给系统里的 ssh 程序。两者的代理设置互不影响,下表是最简对照。
| 远程地址形式 | 传输方式 | 代理配置位置 |
|---|---|---|
https://github.com/example/repo.git | HTTP(S),libcurl | http.proxy / https_proxy 环境变量 |
git@github.com:example/repo.git | SSH | ~/.ssh/config 的 ProxyCommand |
另外 git 不会读取浏览器或系统"网络设置"里的代理。浏览器能打开 GitHub 而命令行克隆卡住,多半就是这个原因。
HTTPS 仓库怎么配代理?
最直接的办法是写进 git 配置。http.proxy 这个名字虽然带 http,实际对 http:// 和 https:// 两种仓库都生效。只想临时用一次的话,在当前终端导出环境变量,不碰配置文件。
# 全局配置
git config --global http.proxy http://proxy.example.com:8080
# 只对当前终端生效
export https_proxy=http://proxy.example.com:8080
git clone https://github.com/example/repo.git
# 取消
git config --global --unset http.proxy
要认证的话,把用户名密码写进地址:http://user:password@proxy.example.com:8080。密码里有 @、:、/ 之类字符时必须做百分号编码(@ 写成 %40),否则会被当成地址的一部分解析。注意这个值会以明文存在 ~/.gitconfig 里。环境变量建议用小写名字,curl 系工具都认。
只给某一个域名配代理
全局代理会把公司内网的 git 服务器也拐到代理上去。git 支持按 URL 前缀配置,留空表示该前缀不走代理:
git config --global http.https://github.com.proxy http://proxy.example.com:8080
git config --global http.https://git.internal.example.com.proxy ""
socks5 和 socks5h 到底该写哪个?
区别只有一个:域名由谁解析。socks5:// 是本机先把域名解析成 IP 再交给代理,socks5h:// 是把域名原样交给代理,由代理去解析。本机 DNS 不准、被污染或者解析很慢的时候,用 socks5h:// 能直接绕开这一环。HTTP 代理不存在这个问题,域名本来就是交给代理的。
git config --global http.proxy socks5h://user:password@proxy.example.com:1080
另一个高频错误是协议和端口对不上:把 http:// 地址指向一个 SOCKS 端口(或者反过来),报错往往是 "Failed to connect" 或者 "Proxy CONNECT aborted",而不是一句"协议不对"。一个代理同时提供 HTTP 和 SOCKS5 的时候,务必确认两个端口各自对应哪种协议。
配完了还是不通,按什么顺序查?
先看 git 实际读到了什么配置,再看它连的是谁,最后才怀疑代理本身。这个顺序能排除大多数"自己配错"的情况。
git config --show-origin --get-regexp proxy:列出所有代理相关配置以及来自哪个文件,系统级、用户级、仓库级都会生效。env | grep -i proxy:看环境变量里有没有旧的残留值。GIT_CURL_VERBOSE=1 git clone URL:输出里的连接行应当出现你的代理主机,而不是目标服务器。- 用 curl 走同一个代理测一次:
curl -x http://proxy.example.com:8080 -I https://github.com。curl 也失败,说明问题在代理或网络,不在 git。
常见报错对照:Received HTTP code 407 from proxy after CONNECT 是认证没过,先检查密码是否做了编码、是否被重置过;Failed to connect to proxy 多半是主机、端口或协议写错。
SSH 仓库怎么走代理?
在 ~/.ssh/config 里为目标主机加一条 ProxyCommand。下面用 OpenBSD 版 netcat,-X 5 表示 SOCKS5(HTTP 代理用 -X connect),-x 后面是代理地址。
Host github.com
ProxyCommand nc -X 5 -x proxy.example.com:1080 %h %p
不同系统自带的 nc 参数不一样,Windows 上通常改用 Git for Windows 附带的 connect 工具,具体参数看它自己的帮助输出。nc 传代理密码很别扭,所以这一条路上,按来源 IP 放行的代理会省事得多。如果只是 22 端口被限制,直接把远程地址换成 HTTPS 形式往往比折腾 SSH 更快:git remote set-url origin https://github.com/example/repo.git。
克隆很慢,先判断是网络问题还是仓库太大
大仓库的完整历史本来就慢,这和代理无关。判断办法是对比:同一个代理下用 curl 访问同一个站点,响应正常但 git 一直卡在 "Receiving objects",那更可能是仓库体量或传输细节的问题,可以试下面几种减负的办法。
git clone --depth 1 --single-branch URL:只拉最新一次提交和一条分支。需要完整历史时再git fetch --unshallow。git clone --filter=blob:none URL:部分克隆,先不下载文件内容,用到时再按需取。git -c http.version=HTTP/1.1 clone URL:强制 HTTP/1.1,有些环境下 HTTP/2 在传输中途会卡住。- 配置
http.lowSpeedLimit和http.lowSpeedTime:低于阈值持续一段时间就中止,不再无限挂着,方便脚本里重试。
代理按流量计费的话,浅克隆和部分克隆还能直接省流量,值得养成习惯。
安泊 VPN 能在哪里帮上忙
安泊 VPN 的代理 IP(HTTP/SOCKS5 proxy)独占一个 IP,同时提供 HTTP(含 HTTPS 隧道)和 SOCKS5 两种协议,共用同一组用户名密码,上面两种地址写法都能用。还可以设置来源 IP 白名单,命中的机器不用密码,这样 ~/.gitconfig 里就不必留明文密码。用量计入流量套餐,用尽后代理会关闭,所以大仓库建议用浅克隆。详见代理 IP 页面。
