背景

无论是区分工作和个人还是其它原因,你可能注册了多个 Github 账号(账号 A,账号 B),你还想通过 ssh 连接,免得无尽的账号密码输入。
你很自然的生成两套公钥私钥

ssh-keygen -t ed25519 -C "[email protected]"

然后分别把公钥添加到 GitHub 账号中,https://github.com/settings/keys

分别管理不同账号下的仓库,你会发现最多只能管理其中一个账号下的仓库。

原因

这是因为 Github 是用密钥来确定当前用户的,ssh 默认是使用~/.ssh/id_rsa 这个私钥的,所以此时只能管理跟这个私钥匹配的那个账号。
可以用如下命令测试:

ssh -T [email protected]

# 或者

ssh -T -p 443 [email protected]

这个会返回

Hi {账号A名称}! You've successfully authenticated, but GitHub does not provide shell access.

指定另外一个 ssh key

ssh -T [email protected] -i "~/.ssh/your_second_ssh_key"

会返回账号 B 名称

管理多个 Github 账号

要管理多个 Github 账号,就是在尽心 git 操作时使用不同的密钥

  • 方法一: 设置不同的 Host,通过 Host 分别指定密钥
    修改~/.ssh/config 文件
# default 账号A
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa

# two 账号B
Host work.github.com
HostName github.com
User git
IdentityFile ~/.ssh/your_second_ssh_key

Host 名不能重复
IdentityFile,指定对应的密钥

这个方法的弊端,账号 B 名下的仓库需要修改 remote url,将github.com修改为work.github.com
只有这样才能区分。

  • 方法二: git 操作时指定 key
git clone [email protected]:{账号B}/{repo}.git --config core.sshCommand="ssh -i ~/.ssh/your_second_ssh_key"

也可以将 key 放在 config 中

git config core.sshCommand "ssh -i ~/.ssh/you_ssh_key"

但是这个 key,改动的概率还不低,所以放在 config 中不太合理。

  • 方法三: 修改当前环境中 git 使用的 key

每次操作都要指定 key,过于繁琐,可以 在当前终端中设置环境变量


set GIT_SSH_COMMAND=ssh -i "C:\Users\YourUserName\.ssh\id_rsa_another"
# powershell
# $env:GIT_SSH_COMMAND = 'ssh -i "C:\Users\YourUserName\.ssh\id_rsa_another"'

git push origin branch_name

注意:此时用 ssh -T 去测试,还是返回的默认账号名,GIT_SSH_COMMAND 是给 git 用的,ssh 还是用的默认 key

本质上,管理不同账号下的 repo,需要切换本地使用的 key,就是修改 GIT_SSH_COMMAND 环境变量,
很自然想到可以通过别名的方式来快速达到这个目的。
linux 设置环境变量比较简单,网上也很多教程,这里就不说了

现在说下 Windows 下的方法

  1. 新建一个 bat 文件,用 doskey 命令设置 alias
@echo off
doskey ls=dir /b $*
doskey {XXXXX}=set GIT_SSH_COMMAND=ssh -i "C:\Users\LiKX\.ssh\id_rsa_one"
doskey {YYYYY}=set GIT_SSH_COMMAND=ssh -i "C:\Users\LiKX\.ssh\id_ed25519_another"

# 说明:
# doskey 相当于 Linux 中的 alias,等号左边是右边的别名;
# $\* 表示这个命令可能有的其他参数;
  1. 修改注册表,使 cmd 启动时自动执行该 bat 文件
    win+r,键入 regedit,进入地址:计算机\HKEY_CURRENT_USER\Software\Microsoft\Command Processor,右边空白处右键新建->字符串值。
    picture 0 pic_1737009374801-1737009379470

双击编辑该值,随便起个名字(比如 AutoRun),数值数据里填刚才新建的 bat 文件的路径

确定后重启 cmd,别名就可以用了

  1. 放到环境变量中
    但是修改注册表有一定的风险,也不一定有权限去修改,此时可以将别名文件放到 PATH 环境变量中的某个路径下,或者 PATH 中新增一个,假设这个文件名为 alias.bat那么每次有切换账号的需求时,执行一下 alias(alias.bat 文件),然后再执行一下修改 GIT_SSH_COMMAND 的别名,就可以实现切换密钥的目的
  • 方法四:通过别名修改当前密钥
    创建别名文件,将其放到 PATH 中的路径下,通过别修改 GIT_SSH_COMMAND 的值,然后再执行 git 操作,管理多个账号
    也可以创建多个文件,每个文件中修改 GIT_SSH_COMMAND 的值,这样就可以一个命令完成切换