Kang's Blog

Kang's Blog

04 Sep 2021

如何设置 Git 代理

TL;DR

SSH

~/.ssh/config

Host github.com
    ## HTTP
    ProxyCommand nc -v -X connect -x [your_proxy_ip]:[your_http_proxy_port] %h %p
    ## SOCKS5
    ProxyCommand nc -v -x [your_proxy_ip]:[your_socks5_proxy_port] %h %p

值得一提的是,网上很多案例是这样写的(以 HTTP 为例):

Host github.com
    HostName github.com
    User git
    ProxyCommand nc -v -X connect -x [your_proxy_ip]:[your_http_proxy_port] %h %p

上述多了 HostNameUser 两个指令,分别表示主机名称用户名

但在 clone 代码时的命令为:git clone git@github.com:[user]/[repository].git。其中 git 为用户名,github.com 为主机名。根据 手册描述,SSH 遵循命令行优先,命令行指定了主机名和用户名,优先级最高,不会用到配置文件中的主机名和用户名。所以这里不用再重复添加 HostNameUser 指令。

HTTP/HTTPS

## HTTP
$ git config --global http.proxy http://[your_proxy_ip]:[your_http_proxy_port]
$ git config --global https.proxy http://[your_proxy_ip]:[your_http_proxy_port]
## SOCKS5
$ git config --global http.proxy socks5://[your_proxy_ip]:[your_socks5_proxy_port]
$ git config --global https.proxy socks5://[your_proxy_ip]:[your_socks5_proxy_port]

正文

Git 通过 四种协议 下载代码:Local Protocol,HTTP/HTTPS protocols,SSH protocol,Git Protocol。

最常用的是 HTTP/HTTPS 和 SSH,下面分别讨论这两者如何设置代理。

假设,我现在的代理服务器的 IP 为:127.0.0.1,分别开启了 SOCKS5(1080) 和 HTTP(1081) 两个端口。

SSH

使用 git clone git@github.com:[user]/[repository].git 的方式克隆代码,就是 SSH 方式。

在 ssh_config 中有个选项为 ProxyCommand,通过它可以指定连接到代理服务器的命令。

而连接代理服务器的命令,可以使用官方推荐的 openbsd-netcat 来进行连接。

openbsd-netcat / netcat / nc

注:有多个软件名为 netcat,注意不要弄错了。具体可以访问 ArchLinux 的仓库debian 的仓库 进行下载。

在 ArchLinux 中,通过以下命令安装 openbsd-netcat

$ sudo pacman -S openbsd-netcat

openbsd-netcat 是一个处理 TCP/IP 的瑞士军刀,在命令行中使用关键字 netcatnc 来调用。

openbsd-netcat 使用 -x proxy_address[:port] 连接代理服务器;使用 -X proxy_protocol 设置代理的协议。

注:查看文档 可知,openbsd-netcat 默认使用 SOCKS5(-X 5) 进行对代理服务器的链接。如需使用 HTTP 协议,需加上 -X connect

SSH proxy

在 SSH 中,编辑 ~/.ssh/config 来配置代理。

  • 所有的 SSH 链接都走 HTTP 代理:

    Host *
        ProxyCommand nc -v -X connect -x 127.0.0.1:1081 %h %p
    

    注:这里的 %h,%p 是 ssh_config 中的 tokens,是对属性的简写:

    • %h:远程主机名。
    • %p:远程端口。
  • 只连接 GitHub 时使用 HTTP 代理:

    Host github.com
        ProxyCommand nc -v -X connect -x 127.0.0.1:1081 %h %p
    
  • 连接 GitHub 时使用 SOCKS5 代理:

    Host github.com
        ProxyCommand nc -v -x 127.0.0.1:1080 %h %p
    

HTTP/HTTPS

使用 git clone https://github.com/[user]/[repository].git 的方式克隆代码,就是 HTTP/HTTPS 方式。

Git 中有 [http/https].proxy 选项,直接设置即可:

## HTTP
$ git config --global http.proxy http://127.0.0.1:1081
$ git config --global https.proxy http://127.0.0.1:1081
## SOCKS5
$ git config --global http.proxy socks5://127.0.0.1:1080
$ git config --global https.proxy socks5://127.0.0.1:1080

在 Shell 中,还可以通过设置 [http/https]_proxy 来达到代理的目的:

## HTTP
$ export http_proxy=http://127.0.0.1:1081
$ export https_proxy=http://127.0.0.1:1081
## SOCKS5
$ export http_proxy=socks5://127.0.0.1:1081
$ export https_proxy=socks5://127.0.0.1:1081

注:设置 [http/https]_proxy 会让当前 Shell 的 HTTP/HTTPS 请求都转发到代理服务器上。如,使用 curl 时会从代理服务器上下载数据,而不是本机。

Refs: