git三种协议的代理配置

最近在安装 MIT6.S081 的实验环境时又受到了国内网络的制裁,这里浅浅记录一下如何配置 git 的代理。

所用的环境是 WSL2 的 Ubuntu-20.04.4 LTS,SSR 运行在 windows 的 12345 端口,打开了允许来自局域网的连接。

获取windows的ip

众所周知,WSL2 会把 windows 的虚拟网卡 vEthernet 作为默认网关,所以我们需要的代理地址就是 ip:12345,其中 ip 是 vEthernet 的地址。

然而 vEthernet 和 WSL2 的 ip 每次重启都会变,所以写一个 gethost.sh 来获取 vEthernet 的 ip:

1
2
#!/bin/sh
ip route | grep default | awk `{print $3}`

然后 chmod +x gethost.sh 添加执行权限即可。

配置 git 代理

https://

对于形如 git clone https://path/to/repository.git 的命令,只需要

1
2
$ export http_proxy=http://$(/path/to/gethost.sh):12345
$ export https_proxy=http://$(/path/to/gethost.sh):12345

设置整个系统的全局代理即可。

git@

形如 git clone git@github.com:path/to/repository.git 的命令,本质上用了 ssh 来和服务器通信,所以要配置 ssh 代理。配置文件在 ~/.ssh/config

1
2
3
4
5
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/github
ProxyCommand connect -H <hostip>:12345 %h %p

其中 ProxyCommand 这一项就是关于 ssh 代理的配置。connect -H <hostip>:12345 %h %p 是 ssh 连接时执行的命令。

connect 可能需要通过 apt install connect-proxy 安装。-H 指明通过 http 协议进行连接,<hostip> 需要改成 vEthernet 的 ip,%h %p 是 ssh 命令自己传入的参数,即服务器的 hostname 和 port。

上面的命令唯一需要自己改写的地方就是 <hostip> ,可以在 ~/.bashrc 中写一段脚本,通过 gethost.sh 实现自动替换。

git://

形如 git clone git://path/to/repository 的命令配置代理较为特殊。

首先要写一个执行代理命令的脚本,比如叫 gitproxy.sh

1
2
3
#!/bin/sh
host=$(/path/to/getHost.sh)
connect -H $host:12345 "$@"

chmod +x gitproxy.sh 添加执行权限。然后配置:

1
$ git config --global core.gitproxy "/path/to/gitproxy.sh"

“$@” 在 sh 中表示脚本被执行时传入的全部参数,在这里的作用等同于 ssh 配置命令中的 %h %p

至此,三种协议的 git 代理配置都已经列举完毕。


git三种协议的代理配置
https://ch3chohch3.github.io/2022/05/11/git_proxy/
作者
CH3CHOHCH3
发布于
2022年5月11日
许可协议