如果你在克隆或从远程仓库获取数据时遇到很慢甚至超时的情况,那么此时你可能需要配置 Git 的代理。我这里就讲讲两种情况的代理方法:使用 HTTP 或 HTTPS 协议连接到 Git 仓库的代理方法和使用 SSH 协议连接到 Git 仓库的代理方法。
- 如果远程仓库的格式像下面那样,这种就是使用 HTTP 或 HTTPS 协议连接到 Git 仓库的情况
1 | http://github.com/cms-sw/cmssw.git |
- 如果远程仓库的格式像下面那样,这种就是使用 SSH 协议连接到 Git 仓库的情况
1 | git@github.com:cms-sw/cmssw.git |
预先准备
在开始操作之前,你需要明确这些内容:
- 电脑已经安装了 Git(这不是废话吗,23333)。如果你是 Windows 用户,那么本文的命令你需要通过 Git Bash 来执行;如果你是 Linux 或 macOS 用户直接在终端运行即可。
- 知道如何用 vim 编辑文件,退出编辑的基本操作。
使用 HTTP 或 HTTPS 协议连接到 Git 仓库的代理方法
针对所有域名的 Git 仓库
- 这样做是对所有域名生效的的:
git config –global http.proxy
protocol
://127.0.0.1:port
注意: --glboal
选项指的是修改 Git 的全局配置文件 ~/.gitconfig
,而非各个 Git 仓库里的配置文件 .git/config
。protocol
指的是代理的协议,如 http,https,socks5 等。port
则为端口号。
针对特定域名的 Git 仓库
- 或者针对特定域名生效:
git config –global http.
url
.proxyprotocol
://127.0.0.1:port
注意:
- 此处的
url
即为你需要走代理的仓库域名,url
以http://
和https://
打头的均用这个方法。 - 网上很多中文教程,可能会告诉你
https://
打头的url
使用“git config –global https.https://example.com.proxyprotocol
://127.0.0.1:port
”,这种做法其实是错的!记住一点:Git 不认 https.proxy ,设置 http.proxy 就可以支持 https 了。 - 如果想了解
url
的更多模式,如子域名等的情况,可参照 Git 的官方文档 。网页内容搜索http.<url>.*
,即可找到相关信息。
实例
针对 HTTP 或 HTTPS 协议连接到 Git 仓库的代理方法 Windows,Linux,macOS 用户的操作是一样的。
也许你光看我上面的内容还看不明白,不妨我们来看下实例部分:
此处以 Clash for Windows 为例子。如图:

Clash for Windows 既支持 HTTP / HTTPS 协议代理,也支持 SOCKS v5 协议代理。如果你使用其他的代理软件,你可以根据你使用的代理软件的代理协议和本地端口号参考本文修改即可。
针对所有域名的 Git 仓库
根据你的代理软件支持的代理协议选取其中一种即可:
1 | git config --global http.proxy http://127.0.0.1:7890 |
注意:7890 为 Clash for Windows 的 http 代理端口。
1 | git config --global http.proxy socks5://127.0.0.1:7891 |
注意:7891 为 Clash for Windows 的 socks5 代理端口。
针对特定域名的 Git 仓库
前面我们说的是,让所有域名下的仓库都走代理的情况,但是在现实情况下我们并不想这么做。那么现在我来介绍一下针对特定域名仓库走代理的做法,此处以 GitHub 为例:
当我们从 GitHub 仓库克隆源码时我们往往是这么做的的:
1 | git clone https://github.com/<user>/<repository>.git |
那么我前面所提到的 url
就是 https://github.com
根据你的代理软件支持的代理协议选取其中一种即可:
1 | git config --global http.https://github.com.proxy http://127.0.0.1:7890 |
1 | git config --global http.https://github.com.proxy socks5://127.0.0.1:7891 |
使用 SSH 协议连接到 Git 仓库的代理方法
在这种情况下,Git 依靠 ssh 处理连接; 为了通过代理进行连接,您必须配置 ssh 本身,在 ~/.ssh/config
文件中设置 ProxyCommand 选项。Linux 和 macOS 是通过 nc
来执行 ProxyCommand 的,Windows 下则是通过 connect
。
相关文档
- ssh_config(5) ProxyCommand 的内容:
1 | ProxyCommand |
- nc(1)
-X
和-x
选项的的内容:
1 | -X proxy_protocol |
- connect
-H
和S
选项的内容
1 | -H option specify hostname and port number of http proxy server to relay. If port is omitted, 80 is used. You can specify this value by environment variable HTTP_PROXY and give -h option to use it. |
实例
接下来的操作,请按照你的系统,以及所需代理协议进行选择:
Linux 和 macOS 用户
编辑 ~/.ssh/config
文件
1 | vim ~/.ssh/config |
给文件加上如下内容:
1 | Host github.com |
解释:
Host
后面 接的github.com
是指定要走代理的仓库域名。- 在 ProxyCommand 中,Linux 和 macOS 用户用的是
nc
。-X
选项后面接的是connect
的意思是 HTTPS 代理。-x
选项后面加上代理地址和端口号。- 在调用 ProxyCommand 时,
%h
和%p
将会被自动替换为目标主机名和 SSH 命令指定的端口(%h
和%p
不要修改,保留原样即可)。
编辑 ~/.ssh/config
文件
1 | vim ~/.ssh/config |
给文件加上如下内容,2种任选一个:
Host
后面 接的github.com
是指定要走代理的仓库域名。- 在 ProxyCommand 中,Linux 和 macOS 用户用的是
nc
。- 在调用 ProxyCommand 时,
%h
和%p
将会被自动替换为目标主机名和 SSH 命令指定的端口(%h
和%p
不要修改,保留原样即可)。- 如果
-X
选项后面接的是数字 5,那么指的就是 socks5 代理。- 当然你直接不写上
-X
选项也是可以的,因为在没有指定协议的情况下,默认是使用socks5代理的。所以以下 2 种的写法效果一样 ,都指的是走 socks5 代理:
①. 第一种
1 | Host github.com |
或
②. 第二种
1 | Host github.com |
Windows 用户
编辑 ~/.ssh/config
文件
1 | vim ~/.ssh/config |
给文件加上以下内容:
1 | Host github.com |
解释:
Host
后面 接的github.com
是指定要走代理的仓库域名。- 在 ProxyCommand 中,Windows 用户用的是
connect
。-H
选项的意思是 HTTP 代理。- 在调用 ProxyCommand 时,
%h
和%p
将会被自动替换为目标主机名和 SSH 命令指定的端口(%h
和%p
不要修改,保留原样即可)。
编辑 ~/.ssh/config
文件
1 | vim ~/.ssh/config |
给文件加上如下内容:
1 | Host github.com |
解释:
Host
后面 接的github.com
是指定要走代理的仓库域名。- 在 ProxyCommand 中,Windows 用户用的是
connect
。- 单独的
-S
选项指的就是 socks5 代理- 在调用 ProxyCommand 时,
%h
和%p
将会被自动替换为目标主机名和 SSH 命令指定的端口(%h
和%p
不要修改,保留原样即可)。
如何取消 Git 和 ssh 的代理
这里就不多说了,说了那么多,我们无非就是修改了 2 个文件,即 ~/.gitconfig
和 ~/.ssh/.config
,删除或注释(在相应行的开头加上 #
即可)我们增加的相应内容即可完成取消代理。