网络与开发工具实战笔记
代理配置
约 8 分钟读完

给 git 配代理:http.proxy、SSH 与克隆慢的排查

git 的 HTTPS 和 SSH 走两条独立的网络路径:前者读 http.proxy 或 https_proxy 环境变量,后者要在 ~/.ssh/config 里写 ProxyCommand。克隆慢先用 GIT_CURL_VERBOSE 看清实际连的是谁。

编辑部

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.gitHTTP(S),libcurlhttp.proxy / https_proxy 环境变量
git@github.com:example/repo.gitSSH~/.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 实际读到了什么配置,再看它连的是谁,最后才怀疑代理本身。这个顺序能排除大多数"自己配错"的情况。

  1. git config --show-origin --get-regexp proxy:列出所有代理相关配置以及来自哪个文件,系统级、用户级、仓库级都会生效。
  2. env | grep -i proxy:看环境变量里有没有旧的残留值。
  3. GIT_CURL_VERBOSE=1 git clone URL:输出里的连接行应当出现你的代理主机,而不是目标服务器。
  4. 用 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 页面。

参考资料

git
代理配置
SOCKS5
git clone
SSH

常见问题

git config 里设了 http.proxy,为什么 git@ 开头的仓库还是没走代理?
http.proxy 只管 HTTP 和 HTTPS 传输。git@ 开头的仓库走 SSH,由系统的 ssh 程序自己建立连接,需要在 ~/.ssh/config 里给对应主机写 ProxyCommand。也可以用 git remote set-url 把地址换成 https:// 形式,直接复用 http.proxy。
代理密码里有 @ 符号,git 报错怎么办?
代理地址里的用户名和密码是 URL 的一部分,@、:、/、# 等字符需要做百分号编码,例如 @ 写成 %40。不编码的话 git 会把密码拆开解析,表现为认证失败或连不上代理。改好以后可以用 git config --get http.proxy 核对实际存进去的值。
浅克隆之后怎么补全完整历史?
执行 git fetch --unshallow 即可把浅克隆补成完整历史。如果之前还用了 --single-branch,只拉了一条分支,可以再通过 git remote set-branches origin '*' 加回所有分支,然后 git fetch。补全会下载全部历史,按流量计费时注意预留。
http.proxy 的值会不会被环境变量覆盖?
git 配置里的 http.proxy 优先级高于 https_proxy 等环境变量,所以环境变量里写了新代理而 git 仍走旧地址,通常是配置文件里还留着旧值。用 git config --show-origin --get-regexp proxy 能看到每一条设置来自哪个文件,逐个清理即可。
广告
  • 动态、住宅、家宽 3 类 IP
  • 不限设备数,一个账户多端共享
  • 智能分流与 TUN 模式
注册赠送流量