Git在同一机器下配置多个github账号
大多数人有时会需要在同一台机器上管理多个 github 账号,本文以管理两个 github 账号为例,记录了配置 git 的过程,方便下次遇到相同问题时,能节省处理时间。
Git在同一机器下配置多个github账号
约定
- github 账号 1: wylu, 对应邮箱为 wylu@gmail.com
- github 账号 2: 15wylu, 对应邮箱为 15wylu@gmail.com
生成第一对 SSH key
第一个密钥对以 wylu 账号为例,在生成之前,我们可以通过 ls -al ~/.ssh
查看是否已有 SSH key。
例如:
1 | ls -al ~/.ssh |
如果 ~/.ssh
下有 "id_rsa"(私钥) 和 "id_rsa.pub"(公钥),说明之前已生成过 SSH key 了,我们可以直接复用这个密钥对(SSH key)。
如果你没有 SSH key 或者你想要重新生成一个 SSH key,可以执行以下命令生成:
- 不存在 SSH Key 时。
遇到输入一路回车使用默认配置。
1 | ssh-keygen -t rsa -C "wylu@gmail.com" |
- 已存在 SSH Key 时。
当询问是否 Overwrite (y/n)?
已存在的 id_rsa
时,直接输入 y
然后回车,其余的一路回车使用默认配置就好。
1 | ssh-keygen -t rsa -C "wylu@gmail.com" |
我们以此 SSH Key 作为默认的密钥对。
生成第二对 SSH Key
假设我们已经拥有了一对 SSH Key 对应于管理 wylu 的 github 账号,现在需要生成另外一对 SSH Key 用于管理 15wylu 的 github 账号。
执行下面的命令生成另一对 SSH Key:
1 | cd ~/.ssh |
方法与上面生成第一对 SSH Key 一样,一路回车,这里使用 -f
选项的作用是指定生成的密钥对文件的名称,以避免覆盖之前的密钥对文件。从输出信息中可以看到,此次生成的私钥文件名为 15wylu_id_rsa
,公钥文件名为 15wylu_id_rsa.pub
。这样同一台机器下,wylu 和 15wylu 都拥有了各自的 SSH Keys:
1 | ls -al ~/.ssh |
在对应的 github 账号中添加 SSH key
参考文章 Git配置SSH Key 中的 添加 SSH Key 到 Github 部分,分别将 id_rsa.pub
文件中的公钥添加到 wylu 账号,将 15wylu_id_rsa.pub
文件中的公钥添加到 15wylu 账号。
使用 ssh-agent 注册新的 SSH 密钥
ssh-agent:是一个可以控制和保存公钥身份验证所使用的私钥的程序,可以理解为一个密钥管理器,ssh-agent 是一个守护进程(daemon),设计它的唯一目的就是对解密的专用私钥进行高速缓存。
如果没有正在运行的 ssh-agent,则执行 eval "$(ssh-agent -s)"
以确保 ssh-agent 运行。
然后使用 ssh-add 添加私钥:
1 | ssh-add ~/.ssh/id_rsa |
使用 ssh-add 将私钥交给 ssh-agent 保管,其他程序需要身份验证时,ssh 将直接从 ssh-agent 获取私钥,而不会提示你输入密码口令以获取私钥,这样就不需要经常输入密码了。可以使用 ssh-add -l
查看已添加到 ssh-agent 中的密钥。
接下来,需要使 ssh-agent 对不同的 SSH 主机使用各自的 SSH 密钥,这是关键部分,我们有两种不同的方法(使用其中一种即可):
- 使用 SSH 配置文件
- 在 ssh-agent 中只有一个活动的 SSH 密钥
使用 SSH 配置文件(推荐)
使用 ~/.ssh/config
作为我们的配置文件,如果文件不存在,我们就创建它。
1 | cd ~/.ssh/ |
编辑 ~/.ssh/config
,使相关 GitHub 帐户的配置类似于以下内容:
1 | # github: wylu, email: wylu@gmail.com |
- Host: 别名,用于区分多个 git 账号,可随意
- HostName: 要连接的服务器的主机名
- IdentityFile: ssh 连接使用的私钥
上面的配置要求 ssh-agent:
- 使用
id_rsa
作为使用 @github.com 的任何 Git URL 的密钥 - 对于使用 @15wylu.github.com 的任何 Git URL,则使用
15wylu_id_rsa
密钥
其规则就是:从上至下读取 config 的内容,在每个 Host 下寻找对应的私钥,你可以根据需要添加更多的 Host。
clone 新仓库
注意:如果使用 SSH 配置文件前,仓库已存在,参考下方 "对于已存在的仓库" 的内容。
这里以上面的配置为例,假设要克隆 15wylu 账号的一个项目,原来使用的命令如下:
1 | git@github.com:15wylu/15wylu.github.io.git |
但是经过配置,我们已经将 15wylu 的 Host 设为了 15wylu.github.com
,而不再是原来的 github.com
,所以相应地 clone 的命令也变成如下:
(请注意克隆时我们使用了 SSH 配置中使用的主机名)
1 | git@15wylu.github.com:15wylu/15wylu.github.io.git |
对于已存在的仓库
假设在配置之前,我们就已经 clone 了仓库。
首先使用 git remote -v
列出本地仓库对应的远程库,检查该 URL 是否与要使用的 GitHub 主机匹配,否则更新远程原始 URL:
以 15wylu 账号的仓库为例:
1 | git remote set-url origin git@15wylu.github.com:15wylu/15wylu.github.io.git |
确保 @
和 :
之间的字符串与我们在 SSH 配置中指定的主机(Host)匹配。
对于本地创建新的仓库
在项目文件夹中使用 git init
中初始化目录为一个 Git 仓库。然后在 GitHub 帐户中创建新的仓库,将其作为远程库添加到本地仓库中:
同样以 15wylu 账号为例:
1 | git remote add origin git@15wylu.github.com:15wylu/remote_repo_name.git |
确保 @
和 :
之间的字符串与我们在 SSH 配置中指定的主机(Host)匹配。将初始提交推送到 GitHub 仓库:
1 | git add . |
小结
在这里,我们实际上是在为不同的主机(Host)添加 SSH 配置规则,说明要在哪个域中使用哪个身份文件(SSH key)。
测试
1 | ssh -T git@github.com |
第一次执行 ssh -T git@github.com
时会有一段警告,直接输入 yes 回车既可。从输出的信息可以看到,wylu 和 15wylu 都认证成功了。
在 ssh-agent 中只有一个活动的 SSH 密钥
这种方法不需要 SSH 配置规则,而是我们手动确保 ssh-agent 在执行任何 Git 操作时仅附加了相关的密钥。
ssh-add -l
将列出附加到 ssh-agent 的所有 SSH 密钥,删除所有这些密钥后,添加你将要使用的一个密钥,以确保 ssh-agent 中只有一个活动的密钥。
例如,假设你要使用 git 操作 15wylu 账号,首先使用下面的命令删除 ssh-agent 中的所有密钥:
1 | ssh-add -D |
然后添加 15wylu 账号对应的密钥:
1 | ssh-add ~/.ssh/15wylu_id_rsa |
此时,ssh-agent 已将密钥映射到 15wylu GitHub 帐户,当我们使用 git 推送、克隆等操作时都是对 15wylu 账号的仓库进行操作。
类似地,假如要使用 git 操作 wylu 账号,则:
1 | ssh-add -D |
为本地仓库设置 git remote url
clone 或创建本地 Git 仓库后,请确保 Git 配置的用户名和电子邮件正是你想要的。GitHub 通过 commit 描述附随的电子邮件 ID 来标识任何提交的作者。
要在本地 Git 目录(本地 Git 仓库下)中列出配置名称和电子邮件,请执行 git config user.name
和 git config user.email
。如果找不到,则需要进行相应的更新,如:
1 | git config user.name "wylu" |
References
How to manage multiple GitHub accounts on a single machine with SSH keys
-
2020-01-14
jsDelivr 是 ProspectOne 开发的公共开源 CDN(Content Delivery Network),专注于性能,可靠性和安全性。每个人均可免费使用,没有带宽限制。jsDelivr 是唯一由中国政府签发并具有有效 ICP 许可证的公共 CDN,并且直接在中国大陆拥有数百个地点。
jsDelivr 有一个十分好用的功能,它可以加速 Github 仓库的文件访问,借助 jsDelivr 我们可以搭建一个稳定快速、高效免费的图床。
-
2019-04-12
-
2019-05-23
记录 Git 配置 SSH-Key 的过程,方便以后查阅。
-
2019-04-07
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.