终端代理
git set proxy:给 git 设置代理
要点
问:代理端口从哪看?
短答:在代理客户端的设置里找「HTTP 端口」或「混合端口」,本页例子里的 7890 只是常见的默认值,请改为你客户端里显示的那个。
客户端若同时给了 HTTP 端口和 SOCKS 端口,git 两种都能用;只有一个混合端口时,http:// 和 socks5h:// 两种写法都指向它。
问:git config 具体怎么设?
短答:一条命令写进全局配置,三个系统写法相同。
# 所有 http / https 远端都走代理
git config --global http.proxy http://127.0.0.1:7890
# 改用 socks5,h 表示域名也交给代理去解析
git config --global http.proxy socks5h://127.0.0.1:7890
# 只给 github.com 走代理,其他地址照旧直连
git config --global http.https://github.com.proxy http://127.0.0.1:7890
# 只这一次走代理,不写配置
git -c http.proxy=http://127.0.0.1:7890 clone https://github.com/git/git
http.proxy[git 配置键]git 走 HTTP 或 HTTPS 时用的代理。① https 开头的仓库地址也由它管,git 没有 https.proxy 这个键,网上流传的 git config –global https.proxy 写进去不起作用;② 它会盖过 http_proxy、https_proxy、all_proxy 三个环境变量。参见:http.网址.proxy。
http.网址.proxy[git 配置键]只对匹配的网址生效。① 协议、主机名、端口逐项比对,写 https://*.github.com 可匹配一级子域;② 单个仓库的单个远端还能用 remote.origin.proxy 单独指定。
socks5h[协议前缀]和 socks5 的差别在于 h 让代理那一端解析域名,本机不发 DNS 查询,git 不会因为本地解析出错而连错地址。
问:Windows、macOS、Linux 有什么不同?
短答:git config 命令完全一样,差别在配置文件位置、临时环境变量写法和 SSH 用的转发程序。
| 项 | Windows | macOS | Linux |
|---|---|---|---|
| 全局配置文件 | %USERPROFILE%\.gitconfig |
~/.gitconfig |
~/.gitconfig |
| 只在当前终端设代理 | PowerShell:$env:HTTPS_PROXY="http://127.0.0.1:7890" |
export HTTPS_PROXY=http://127.0.0.1:7890 |
同 macOS |
| 验证用的 curl | 写 curl.exe(PowerShell 5.1 的 curl 是别名) |
curl |
curl |
| SSH 走代理的转发程序 | connect(Git for Windows 自带) |
nc(系统自带) |
nc(要 OpenBSD 版 netcat) |
问:怎么确认 git 已经走代理?
短答:先看配置读到了没有,再打开 curl 跟踪,看连接是不是先连到本机端口。
git config --show-origin --get-regexp proxy
GIT_TRACE_CURL=1 GIT_TRACE_CURL_NO_DATA=1 git ls-remote https://github.com/git/git HEAD
git config --show-origin --get-regexp proxy
$env:GIT_TRACE_CURL = "1"; $env:GIT_TRACE_CURL_NO_DATA = "1"
git ls-remote https://github.com/git/git HEAD
Remove-Item Env:GIT_TRACE_CURL, Env:GIT_TRACE_CURL_NO_DATA
| 跟踪输出里出现 | 读法 |
|---|---|
| Trying 127.0.0.1:7890,随后 CONNECT github.com:443 | 走了代理 |
| Failed to connect to github.com:443 over proxy 127.0.0.1 | 读到了代理设置,但端口上没有程序在听:客户端没开或端口写错 |
| Trying 后面直接是 GitHub 的公网地址 | 没走代理,配置没被读到 |
git 的出口在哪个地区,用同一个端口跑一次 curl -x http://127.0.0.1:7890 https://chageejichang.co/api/chukou 就能看到,读数怎么理解见 IP 纯净度查询。
问:git@github.com 这种 SSH 地址怎么走代理?
短答:http.proxy 管不到 SSH,要在 ~/.ssh/config 里给 github.com 加一段,并借 GitHub 提供的 443 端口入口。
Host github.com
Hostname ssh.github.com
Port 443
User git
ProxyCommand connect -S 127.0.0.1:7890 %h %p
macOS 和 Linux 把 ProxyCommand 一行改为 nc -X 5 -x 127.0.0.1:7890 %h %p。写好后执行 ssh -T git@github.com,看到带用户名的问候即可。
问:不用代理了怎么撤销?
短答:逐条 unset,再查一遍确认没有剩下的。
git config --global --unset http.proxy
git config --global --unset http.https://github.com.proxy
git config --global --get-regexp proxy
末一条没有任何输出,就清干净了。代理客户端关掉而 git 里还留着设置,就会报 over proxy 那一类错误。
本栏目其他几页:报错原文 Recv failure: Connection was reset 讲 git 连 GitHub 被重置;Codex 代理、Claude Code 国内使用 讲两个 AI 编程工具读哪些变量;docker 代理 讲拉镜像和容器里各设在哪。