# Git 设置代理：http.proxy、作用域与取消代理

Source: https://ipvolt.com/zh/guides/git-proxy-setup
Markdown: https://ipvolt.com/zh/guides/git-proxy-setup.md
Language: zh-CN

[ipvolt 首页](https://ipvolt.com/zh.md) / [指南](https://ipvolt.com/zh/guides.md) / Git 设置代理：http.proxy、作用域与取消代理

集成
发布于: 2026-10-13
阅读约 8 分钟
作者： ipvolt

远程仓库走 HTTP/HTTPS 时，先用 git -c http.proxy 只让一条命令走代理，验证后再用 git config 按需保存到最小作用域。只清掉通用的 http.proxy，按 URL 或 remote 配置的代理可能仍在生效。另讲 407 和证书错误排查、如何取消 Git 代理，附实测路由实验。

给 Git 设置代理时，如果远程仓库走 HTTP 或 HTTPS，先用只对一条命令生效的 `http.proxy` 试一下。写成永久配置之前，还要检查远程仓库的传输方式，以及有没有按 URL 或按 remote 配置的代理。**只清掉通用设置的话，更具体的代理配置可能还在生效。**

文中的地址均为示例。可下载的实验只用回环地址、虚构的凭据和一个临时仓库，全部十项检查于 2026 年 10 月 12 日在 Git 2.50.1（Apple Git-155）、Python 3.14.8 和 macOS 15.7.4 上运行。它验证的是路由和仓库内容，不评测代理服务商，也不测试 HTTPS、SSH 或 push。

## 确认远程仓库走 HTTP(S) 还是 SSH

在已有的仓库里，先在本地查看 remote 地址：

```sh
git remote get-url origin
```

`https://` 或 `http://` 开头的 URL 走 Git 的 HTTP 传输协议；`git@github.com:OWNER/REPO.git` 或 `ssh://git@HOST/REPO.git` 这样的 remote 走 SSH。`http.proxy` 对 SSH 连接不起作用，SSH 的路由请按公司或团队的说明来配置。如果是新克隆，就检查你准备克隆的那个 URL。URL 里嵌入的凭据不要出现在要分享的输出里。参见 [Git 命令与 SSH 文档](https://git-scm.com/docs/git#Documentation/git.txt-GITSSHCOMMAND)。

## Git 设置代理：先只对一条命令生效

先在环境变量里设好 `GIT_PROXY_URL` 和 `GIT_REPO_URL`。`GIT_REPO_URL` 是一个你有权访问的 HTTP/HTTPS remote；`GIT_PROXY_URL` 填服务商文档里给出的网关地址，例如 `http://proxy.example:8080`：

```sh
git -c http.proxy="$GIT_PROXY_URL" \
    -c http.lowSpeedLimit=1 -c http.lowSpeedTime=20 \
    ls-remote "$GIT_REPO_URL"
```

这样不会在任何配置文件里留下代理设置。两个低速选项限制的是传输停滞的时间，不是整条命令的总时限。返回了 refs，说明仓库确实响应了，但单凭命令成功，并不能确定请求走的是哪条路由。要克隆的话，把 `ls-remote` 换成 `clone`，并指定一个新的目标目录。

HTTPS remote 可以走 HTTP 网关：代理 URL 的协议（scheme）描述的是**到网关的那段连接**。只有网关支持 TLS 时，才使用 `https://` 网关。参见 [Git HTTP 选项](https://raw.githubusercontent.com/git/git/v2.56.0/Documentation/config/http.adoc)、[libcurl 代理协议](https://curl.se/libcurl/c/CURLOPT_PROXY.html)。

代理凭据和仓库凭据是两回事。按 Git 文档的说法，代理 URL 里只有用户名、没有密码时，Git 会通过它的凭据机制获取密码。认证方式以网关支持的为准。带真实凭据的 URL 不要写进共享的配置，诊断输出要先脱敏。参见 [Git 凭据](https://git-scm.com/docs/gitcredentials)。

## 用 git config 保存代理：按需选最小作用域

临时检查通过后，从下面选一种配置。这些命令用的是不带凭据的示例网关：

| 生效范围 | 配置命令 | 在哪里运行 |
| --- | --- | --- |
| 单个 HTTPS 主机 | `git config --global 'http.https://github.com/.proxy' 'http://proxy.example:8080'` | 任意目录 |
| 单个已有仓库 | `git config --local http.proxy 'http://proxy.example:8080'` | 该仓库内 |
| 单个 remote（如 origin） | `git config --local remote.origin.proxy 'http://proxy.example:8080'` | 该仓库内 |
| 当前用户的所有 HTTP/HTTPS remote | `git config --global http.proxy 'http://proxy.example:8080'` | 任意目录 |

仓库级（local）配置要求仓库已经存在；首次克隆时，可以用只对单条命令生效的设置，或者在用户级配置里按 URL 设置。URL 匹配和普通的配置优先级是分开判断的，remote 级的设置还会再覆盖一层。参见 [Git 配置作用域](https://git-scm.com/docs/git-config#_scopes)、[remote 代理选项](https://raw.githubusercontent.com/git/git/v2.56.0/Documentation/config/remote.adoc)。

## 路由实验测出了什么

[实验脚本](https://ipvolt.com/downloads/git-proxy-setup/git_proxy_lab.py)会创建一个裸仓库、一个 HTTP 仓库服务器和一个需要认证的转发代理。clone/fetch 成功的用例会核对 commit 是否符合预期、文件内容是否完全一致；直连用例要求代理一次请求都没收到。[记录的结果](https://ipvolt.com/downloads/git-proxy-setup/results.json)保留了命令、请求、失败信息和版本。

| 受控配置 | 观测结果 | 这个结果帮你判断什么 |
| --- | --- | --- |
| 单条命令的 `http.proxy` | 走代理；仓库校验通过 | 先用它做对照 |
| 匹配的 URL 条目设了代理 | 走代理；仓库校验通过 | 检查匹配的那个 URL 条目 |
| 针对另一路径的 URL 条目 | 直连；仓库校验通过 | 限定了范围的条目，管不到范围之外 |
| 正确的 remote 代理覆盖不可用的通用代理 | 走代理；fetch 校验通过 | 检查对应 remote 的设置 |
| remote 代理为空 | 直连；fetch 校验通过 | 在 remote 级禁用代理有效 |
| 命令中把通用代理设为空，只有用户级的通用条目 | 直连；仓库校验通过 | 这样清掉了通用设置 |
| 命令中把通用代理设为空，同时有匹配的 URL 条目 | **走代理；仓库校验通过** | 通用的空值没有清掉 URL 匹配 |
| 匹配的 URL 条目为空，覆盖通用代理 | 直连；仓库校验通过 | 要处理的是匹配的那一条本身 |
| 匹配的 `no_proxy=127.0.0.1` | 直连；仓库校验通过 | 检查继承来的绕过规则 |
| 虚构的代理密码填错 | 退出码 128 / HTTP 407；仓库服务器没有收到请求 | 先解决网关认证 |

十个用例全部符合各自的验收标准，包括故意让认证失败的那个用例。九次 clone/fetch 操作成功，并校验了仓库内容。这些观察结果适用于记录下来的这套本地 Git/libcurl 环境。

把脚本和 [README](https://ipvolt.com/downloads/git-proxy-setup/README.md) 下载到一个新目录，然后运行：

```sh
python3 git_proxy_lab.py > local-results.json
```

实验需要支持 `GIT_CONFIG_GLOBAL` 的 Git（Git 2.32 引入）和带 `ThreadingHTTPServer` 的 Python（Python 3.7 引入），不需要安装第三方 Python 包。这两项要求出自文档；实际只在记录的 Git 2.50.1 / Python 3.14.8 环境中运行过。参见 [Git 2.32 发布说明](https://raw.githubusercontent.com/git/git/v2.32.0/Documentation/RelNotes/2.32.0.txt)和 [Python HTTP 服务器文档](https://docs.python.org/3/library/http.server.html)。实验使用 IPv4 回环地址和专用的 Git 配置文件，基线环境清除了继承的代理变量，结束后删除临时仓库。它用的是哑 HTTP 协议（dumb HTTP），不测试智能 HTTP（smart HTTP）、CONNECT、证书、SOCKS、生产环境的认证系统或 SSH。下文关于证书的建议来自文档。我们对照的是 Git 2.56.0 源码里的文档，实际运行的是 Apple Git 2.50.1。

## 取消 Git 代理：找到并删除生效的那一项

请在本地查看（配置值里可能含有凭据）：

```sh
git config --show-origin --show-scope --get-regexp \
  '^(http\..*proxy|remote\..*\.proxy)$'
git config --get-urlmatch http.proxy "$GIT_REPO_URL"
```

第一条命令会列出通用的、按 URL 的和按 remote 的代理条目。第二条报告 HTTP 的 URL 匹配结果；它不考虑 remote 级的设置，也证明不了实际走的网络路径。另外，参照[代理环境变量指南](/zh/guides/proxy-environment-variables)，检查实际运行的进程里的代理和绕过变量。

只删除你想删的那个键，并且只在对应的作用域里删。以示例中的主机条目为例：

```sh
git config --global --unset-all 'http.https://github.com/.proxy'
```

示例中的 remote 条目，要在它所在的仓库里删除：

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

用户级的通用条目，用 `git config --global --unset-all http.proxy` 删除。键不存在时，命令会返回非零退出码。删掉一项后，可能会露出另一项仍在生效的设置，所以要再查一遍，并重新做路由检查。上面的实验演示了这一点：只清掉 `http.proxy`，匹配的 URL 条目仍可能生效。

## 判断是哪一层出了问题

| 症状 | 下一步该查什么 |
| --- | --- |
| 无法解析代理，或连接被拒绝 | 所选网关的主机名、端口，以及网络能否访问 |
| HTTP 407 | 网关账户和它支持的认证方式；按 [407 排查清单](/zh/guides/fix-proxy-error-407)检查 |
| 连接成功后仓库认证失败 | 仓库权限和仓库的凭据助手（credential helper） |
| 证书校验失败 | 出错的那条 TLS 连接的签发者、主机名和经批准的 CA 信任配置 |
| SSH remote 仍然失败 | SSH 专用的路由和传输策略 |
| 命令成功了，但看不出有没有走代理 | URL/remote 设置、环境变量中的绕过规则和网关日志 |

如果公司使用经批准的 TLS 拦截 CA，Git 对应的选项是 `http.sslCAInfo`；连接 HTTPS 代理那一段的 TLS 则用单独的 `http.proxySSLCAInfo`。受信任的 CA 证书向管理员索取，并保持证书校验开启。这是两条不同的连接，而这个 HTTP 实验两者都没有测试。Windows 上的 Schannel 可能使用系统的证书存储，而不是你提供的 CA 文件；请遵循该平台的相应策略。参见 [Git TLS 选项](https://raw.githubusercontent.com/git/git/v2.56.0/Documentation/config/http.adoc)。

要在 Git 之外给网关做基线测试，可以用[设了时限的 curl 检查](/zh/guides/curl-proxy-setup#先发送一个有限制的请求作为基线)。curl 请求成功，并不能说明 Git 会选哪条路由。

遇到超时，先找出卡在哪个阶段，再考虑调大时限；参见[代理超时排查](/zh/guides/proxy-timeout-troubleshooting)。

ipvolt 销售移动代理和住宅代理，住宅代理每 GB $0.60 起：[查看价格](https://ipvolt.com/zh/pricing)。

## 参考来源与延伸阅读

- [Git HTTP options](https://raw.githubusercontent.com/git/git/v2.56.0/Documentation/config/http.adoc)
- [Git configuration](https://git-scm.com/docs/git-config)
- [Git remote options](https://raw.githubusercontent.com/git/git/v2.56.0/Documentation/config/remote.adoc)

## 相关指南

- [代理环境变量：HTTP_PROXY 与 NO_PROXY](https://ipvolt.com/zh/guides/proxy-environment-variables.md)
- [不靠猜测修复代理错误 407](https://ipvolt.com/zh/guides/fix-proxy-error-407.md)
- [一次一个阶段地排查代理超时](https://ipvolt.com/zh/guides/proxy-timeout-troubleshooting.md)

## 关于 ipvolt

示例使用通用的代理设置，并附上原始技术文档链接。具体产品的行为请向你的服务商确认。ipvolt 销售移动代理和住宅代理，住宅代理每 GB $0.60 起。

[阅读英文原文](https://ipvolt.com/guides/git-proxy-setup.md)

## 接入你的第一个代理。

移动代理每天 $9 起。住宅代理每 GB $0.60 起。

[购买移动代理](https://ipvolt.com/dashboard/mobile)

[购买住宅代理](https://ipvolt.com/dashboard/residential)

