Git 使用 代理

首先Git 与远程仓库(如 Github) 的连接有两种,分别是 HttpSSH

HTTP 启用代理

首先介绍命令 git config --globalgit config --global 是用于设置全局Git配置的命令。通过 --global 选项,你可以将配置应用到当前用户下所有的Git仓库,而不仅仅是当前仓库。

以下是几个常见的用法示例:

  • 设置用户名:
    1
    git config --global user.name "Your Name"
  • 设置邮箱:
    1
    git config --global user.email "yourname@example.com"
  • 配置默认的文本编辑器:
    1
    git config --global core.editor "vim"
  • 显示已设置的全局配置:
    1
    git config --global --list
  • 同理设置全局的 Http 代理
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # Sock5 代理
    git config --global http.proxy socks5://127.0.0.1:7890
    git config --global https.proxy socks5://127.0.0.1:7890

    #需要用户名和密码进行验证并限定代理的域名(如 github.com):
    git config --global http.proxy.https://<域名>.proxy <用户名>:<密码>@<代理地址>
    git config --global https./<域名>.proxy <用户名>:<密码>@<代理地址>

    #如果你想禁用全局代理,可以使用以下命令:
    git config --global --unset http.proxy
    git config --global --unset https.proxy

SSH 启用代理

回顾一下当使用 git clone 命令通过SSH克隆代码仓库时,背后涉及到以下原理:

  1. SSH 密钥对生成:首先,你需要在本地计算机上生成一对 SSH 密钥(公钥和私钥)。在生成密钥对时,公钥将被添加到你的 GitHub 账户中,而私钥则保留在你的本地计算机上。

    1
    ssh-keygen -t rsa -C "your_email@example.com" -f ~/.ssh/name_of_your_private_key
  2. SSH 连接建立:通过 SSH 协议,你的本地计算机与远程服务器之间建立一个加密的连接。这个连接用于在本地计算机和远程代码仓库之间传输数据。在建立连接时,SSH 将使用你的私钥与远程服务器进行身份验证。

  3. 远程仓库验证:当连接建立后,Git 将使用你提供的 SSH URL 来访问远程代码仓库。在这个过程中,Git 使用你的公钥在远程服务器上进行身份验证,以确认你具有访问该代码仓库的权限。

  4. 代码仓库克隆:一旦成功验证身份并获得了访问权限,Git 将从远程仓库拉取所有代码和历史记录,并在本地创建一个与远程仓库相同的副本。这样,你就可以在本地计算机上对代码进行修改、提交和推送。

通常通过命令

1
ssh -vvvT  git@github.com -i ~/.ssh/name_of_your_private_key

来check 2、3步。参数中 v 的数量越多,返回的 debug 信息越多。

值得注意的是 ssh 在默认情况下只会使用 ~/.ssh/id_<Algorithm> 的 private key。<Algorithm> 表示加密算法比如 RSA,ECDSA 等。所以如果你生成密钥时指定了特定的名字,需要在连接时需要用参数 -i 指定私钥的路径。

Config

为了避免每次都需要制定冗长的参数,~/.ssh/config 文件应运而生,使我们的 ssh 命令十分简洁。

~/.ssh/config 文件结构如下:

1
2
3
4
5
Host myserver # 指定主机的别名,用于标识该连接配置适用于哪个主机。可以使用通配符 `*` 匹配多个主机别名。
HostName 192.168.1.100 # 指定主机的 IP 地址或域名。
User myusername # 指定连接远程主机时使用的用户名。
IdentityFile ~/.ssh/id_rsa_server # 指定用于身份验证的私钥文件的路径。
Port 22 # 指定连接的端口号

原本的 ssh 命令

1
ssh myusername@192.168.1.100 -p 22 -i  ~/.ssh/id_rsa_server

而当我们配置好上面的 config 文件后,ssh 命令简化为

1
ssh myserver

为了启用代理我原本是这么写的

1
2
3
4
5
6
Host github.com
HostName github.com
User git
Port 22
ProxyCommand connect -S 127.0.0.1:7890 %h %p
IdentityFile C:\Users\lenovo\.ssh\id_rsa_github

ProxyCommand 表示使用代理连接。connect 是一个用于建立连接的工具,-S 127.0.0.1:7890 指定代理服务器的地址和端口号 。%h%p 是SSH配置中的占位符,分别代表目标主机和目标端口。

然而报错

1
2
kex_exchange_identification: Connection closed by remote host
Connection closed by UNKNOWN port 65535

端口换成 443,主机名改为 ssh.github.com 成功。

1
2
3
4
5
6
Host github.com
HostName ssh.github.com
User git
Port 443
ProxyCommand connect -S 127.0.0.1:7890 %h %p
IdentityFile C:\Users\lenovo\.ssh\id_rsa_github

推断原因可能是代理服务器的DNS解析的问题。