跳至主要內容

用 SSH 推拉 GitHub 并实现多账户切换

Chilfish大约 4 分钟GitSSH

为什么要 SSH

一开始使用 git 时是在 VSCode 上集成的,初次 push 时填好 github 账号密码之后,之后都不用填密码了。但网上都说用 HTTPS clone 的仓库推拉的时候都要输入密码,原来是有一个配置

git config --global credential.helper store

IDE 已经帮忙把账号密码存在全局了,而且设置的用户名和邮箱也是全局的,所以就“新手友好”多了

而 SSH 协议在初次配置好之后,前后都不用输入账号密码,也还能保证数据的安全。这倒没什么,主要是我想用两个 GitHub 账号来练习一下,两个不同的邮箱注册。但这时问题就在,开始时我都把账号信息设全局了,这要怎么以另一个 git 身份来推拉呢……?

正好看到 在一台电脑上同时使用多个 github 账号open in new window 中使用到了 SSH,于是就跟着设置好了,还顺便升级了下 git 版本)

更详细的说明可见 SSH 以下终端 windows 下要在 Git Bash 的命令窗口下执行(或是 powershell

设置 SSH

取消全局设置

先删除掉之前的配置:

git config --global --unset user.name
git config --global --unset user.email

也可以直接去配置文件 C:\user\name\.gitconfig 或是在 ~/.gitconfig 中删除掉

[user]
      name = xxx
      email = [email protected]

创建新的 ssh 密钥

更多可见 SSH

cd ~/.ssh
ssh-keygen -t rsa -C "[email protected]" -f "~/.ssh/name"

这时终端会停在 Enter passphrase (empty for no passphrase):,这里只要选默认的回车就好。最后终端会输出:

Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in test
Your public key has been saved in name.pub
The key fingerprint is:
SHA256:IftSUT3kqF/vLRyOs0mJ9GPg+Eas9eikdTuYAC7OWXs [email protected]
The key's randomart image is:
+---[RSA 3072]----+
|          .o.    |
|         . oo    |
|      . o . ..   |
|      .o +       |
|     ...S.o .    |
|    . oo.=+= o.  |
|   o +..o=*=B+.. |
|    + ..E==+==+. |
|       ..oo ++...|
+----[SHA256]-----+

表示密钥生成成功。这时在 ~/.ssh/ 下会看到两个文件:name 表示生成的私钥,name.pub 表示生成的公钥

添加私钥到 ssh 中

打开 ssh-agent

ssh-agent -s

此时一般会输出类似如下的:

SSH_AUTH_SOCK=/tmp/ssh-C00BbFpAjnb2/agent.3204; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3205; export SSH_AGENT_PID;
echo Agent pid 3205;

然后是添加私钥到账户中:

ssh-add ~/.ssh/name

此时会输出:

Identity added: /c/Users/user/.ssh/name ([email protected])

将公钥添加到 GitHub 账户

首先先复制公钥 name.pub 的内容,不能有多余的字符

然后打开 GitHub:

  • 右上角下拉面板选择 Settings
  • 左侧选择 SSH and GPG keys
  • 点击 New SSH key
  • 随便起一个 title
  • 把公钥粘贴到下面

基本就大功告成了~

测试与 github 的 ssh 连接

终端输入:

首次连接需要用户确认:

The authenticity of host 'github.com (20.205.243.166)' can't be established.
ECDSA key fingerprint is SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

输入 yes 就好:

Hi name! You've successfully authenticated, but GitHub does not provide shell access.

如果 name 是你的 github 用户名,就说明连接成功了

其中,有可能会报 Connection reset by 192.30.255.112 port 22open in new window,这时需要在 ~/.ssh/ 下新建 config 文件并编辑:

Host github.com
  HostName ssh.github.com
  IdentityFile ~/.ssh/id_rsa # 对应私钥的位置
  Port 443

更改仓库的远程连接方式

到 github 仓库的 clone 选项中选中 ssh 链接并复制,终端 cd 到本地仓库:

git remote set-url origin [email protected]:<user>/<repo>.git

然后检查 git 的远程仓库:

git remote -v

如果是:就大成功

origin git@<user>/<repo>.git (fetch)
origin git@<user>/<repo>.git (push)

设置多用户

git 多用户配置

其实就重复生成密钥到把公钥添加到各自的 github 仓库的步骤,注意密钥名称得不重复

然后是重点:在 ~/.ssh/ 下新建 config 文件并编辑:

# 第一个
Host one.github.com
  HostName ssh.github.com
  IdentityFile ~/.ssh/id_rsa_one # 对应私钥的位置
  Port 443

# 第二个
Host two.github.com # 前缀名可以任意设置
  HostName ssh.github.com
  IdentityFile ~/.ssh/id_rsa_two
  Port 443

这样,连接的时候就要指定用户:

回复分别是 ID1 和 ID2 的 github 名,就表示连接成功了

clone 仓库就变成了:

git clone [email protected]:<user>/<repo>.git

设置多用户 git 仓库的 name 和 email

虽然可以每次都在仓库下

git config user.name  ID1
git config user.email E1

但这也太不优雅了,于是有一个开源的 npm 包: git 多用户切换设置 gumopen in new window。前提得先装了 Node.js)或许有别的可以代替,那再找找看吧

pnpm i -g @gauseen/gum

然后添加用户:

gum set User1 --name "user1" --email "email1"

这样的。切换用户时,在仓库下执行:

gum use User1

更多详见 Gum#RADMEopen in new window