跳到正文
查个机

终端代理

git set proxy:给 git 设置代理

首发 查于 第 1 版阅读约 6 分钟

要点

git 不读系统代理,要用 git config 单独设,例如 git config --global http.proxy http://127.0.0.1:7890。只想让 GitHub 走代理,就把键名写成 http.https://github.com.proxy。

问:代理端口从哪看?

短答:在代理客户端的设置里找「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 代理 讲拉镜像和容器里各设在哪。

终端代理栏目的全部页面

查完换哪家

看全部机场推荐

常见问题

git config 里设了代理,npm 和 pip 会跟着走吗?

不会。git config 只写进 git 自己的配置文件。npm 用 npm config set proxy 和 https-proxy 两项,pip 用 --proxy 参数;三者都读的是 HTTPS_PROXY 这类环境变量,想一次管住就在终端里设环境变量。

公司内网的 git 服务器不想走代理,怎么写?

不要设全局的 http.proxy,只设 http.https://github.com.proxy 这一条。git 按网址逐项匹配,内网服务器的地址对不上这条键,自然直连。

设了代理,clone 速度还是没变,是没走代理吗?

先用本页的 GIT_TRACE_CURL 命令确认。输出里有 CONNECT github.com:443,说明已经走了代理,慢在节点线路;没有,说明配置没被读到,用 git config --show-origin --get-regexp proxy 看是哪个文件在起作用。

本页第 (1)
  • :首发

网站地图 · 机场推荐