0x00 前言
当你有 2 个以上的 Github 账号、每个账号的仓库权限又不同时,就需要用到多账号管理。
首先需要知道的是, Github 支持两种协议同步仓库: HTTPS 和 SSH ,但是只有 SSH 可以实现多账号管理。
下面直接进入主题。
0x10 生成密钥对
首先需要为你每个 Github 账号分别创建一对 SSH 密钥,这里以两个账号为例。
有几个账号、就执行几次这个命令: ssh-keygen -t rsa -b 2048
linux 和 windows 的命令是一样的
命令会问三个问题:
- Enter file in which to save the key
- Enter passphrase
- Enter same passphrase again
第 2 和第 3 个问题是让你设置密钥密码,直接回车跳过就好。
主要是第一个问题,你需要为两个账号的密钥分别指定一个唯一的路径,例如我这里分别设置为:
C:/Users/Administrator/.ssh/id_rsa_one
C:/Users/Administrator/.ssh/id_rsa_two
这样两对密钥就会生成到当前系统用户的 .ssh
目录下:
- 公钥文件后缀为
.pub
- 私钥无文件后缀
不要偷懒只生成一对密钥、然后多账号共用密钥,Github 不允许,两个账号没法配置相同的公钥。
0x10 配置 SSH config
在当前系统用户的 .ssh
目录下创建 config 文件,其中添加以下内容:
Host one.github.com
User ${Github.Account.one.email}
Hostname ssh.github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_one
Port 443
Host two.github.com
User ${Github.Account.two.email}
Hostname ssh.github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_two
Port 443
解释一下各个配置项:
- Host: 自定义的名称,用于关联配置,以后 ssh 连接 Github 时会用到
- User: 修改为你的 Github 账号的登录邮箱
- HostName: 固定为
ssh.github.com
- PreferredAuthentications: 固定为
publickey
- IdentityFile: 修改为刚刚生成的密钥对的私钥路径
- Port: 固定为 443
所以只需修改 Host、User、和 IdentityFile 就可以了。
0x20 配置 Github SSH 公钥
登录 Github 每一个账号,分别设置每个账号对应的 SSH 公钥:
- 点击右上角头像
- 点击 Settings
- 点击 SSH and GPG keys
- 点击 New SSH Key 按钮
- 设置 Title 为前面在 config 文件配置的 Host 名称(不强制,自己能辨认即可)
- 设置 Key 的内容为分配给对应账号的公钥
~/.ssh/id_rsa_*.pub
的内容 - 点击 Add SSH Key 按钮提交
0x30 测试 Github SSH 连接
所有账号都配置好后,在本地终端执行命令:
ssh -T git@one.github.com
ssh -T git@two.github.com
其中 one.github.com
、two.github.com
就是前面 config 中指定的 Host 名称。
只要前面配置没问题,就会返回:
Hi xxxxxx! You've successfully authenticated, but GitHub does not provide shell access.
0x40 更新 Git 仓库的远程 URL
在命令行终端中,切换到任意一个 Git 仓库的根目录,执行以下命令修改其远程 URL :
git remote set-url origin ${repo-ssh-url}
其中 ${repo-ssh-url}
可以到该仓库的 Github 页面复制: Code -> SSH -> Copy
例如: git@github.com:lyy289065406/exp-blog.git
复制 URL 后,如果这个仓库是账号 one 才有权限连接的,还需要把 git@github.com
修改为 git@one.github.com
,其中 one.github.com
就是前面 config 中设置的 Host 名称。
最终命令为:
git remote set-url origin git@one.github.com:lyy289065406/exp-blog.git
- 执行
git remote -v
可以查看是否修改远程 URL 成功 - 执行
git pull
可以测试同步远程仓库是否成功
0x50 更新局部用户
首先取消全局用户配置,只需执行一次即可:
git config --global --unset user.name
git config --global --unset user.email
然后切换到每一个 Git 仓库的根目录、单独为每个仓库设置有权限的 用户名/邮箱:
git config user.name "${Github.Account.name}"
git config user.email "${Github.Account.email}"
须得注意的是,Git 的 user.name 和 user.email 不会影响与 Git 服务的认证是选择哪个用户的配置,它们仅用于记录每次提交是谁做的。
0x60 拉取新仓库
以后通过 SSH 拉取新仓库时,可以到该仓库的 Github 页面复制地址: Code -> SSH -> Copy
例如: git@github.com:lyy289065406/exp-blog.git
然后需要修改 SSH 地址: git@one.github.com:lyy289065406/exp-blog.git
最后才执行拉取命令: git clone git@one.github.com:lyy289065406/exp-blog.git