一台电脑双 GitHub 账户配置,同时两个 SSH 密钥

前言

本人搞了两个 GitHub 账号,一个用来正常的和别人合作项目,另一个用来自己写一些代码,希望能做到两个本地账户和远程账号都完全隔离,没有联系,也不会被混淆使用。

但是这样就会有一个问题,设置本地用户 user.email 时候,如果两个 GitHub 账号仓库使用同一个本地用户, GitHub 会将本地的用户自动与相应的 GitHub 账号关联起来,这样在 commit 记录里面就能看到是谁提交的了,这是我不想看到的结果。

最开始以为只要把同一个 SSH 公钥分别添加到两个 GitHub 账户,再在不同的仓库设置不同的 user.nameuser email 就 OK 了. 并不行,每个公钥只能用一次。然后就考虑生成两个密钥,分别添加到不同的账户,但是电脑在连接远程仓库时,只能默认选择其中固定的一个来连接,并不会根据不同仓库的设置选择不同的密钥,结果就是还是只能免密连接一个 GitHub 账户的仓库。

你所使用的 SSH 密钥决定了你是否有权限访问某一个 GitHub 账号下面的仓库,而你本地仓库设置的 use email 决定了在 GitHubcommit 记录中的用户,而一般在没有进行以下配置的情况下,你的电脑只会默认使用一个 SSH 密钥进行连接,这就导致了你只能访问一个 GitHub 账号。

如果访问另一个 Github 账户,在 push 时就会报如下错误:

下面将详细介绍方法:

假设现有两个账号分别如下: 一个账号名为 99Young99、另一个为 CS-Research-alliance

注: 这里举例实现在相同的平台 Github 不同账号使用不同的 SSH,也可以用相同的方法,在不同的平台使用不同的 SSH

1. 生成密钥

首先是先生成两个 SSH 密钥,对应两个身份(假设为 99Young99CS-Research-alliance)。

1.1 检查是否已经有 SSH-Key

打开 Git bash(Linux 中需要打开 Shell),进入 ~/.ssh 目录,通过命令看看电脑上有 SSH-Key 的相关文件没!

cd ~/.ssh
ls

在这里插入图片描述

如果显示 id_rsaid_rsa.pub 文件,说明已经有 SSH Key了。如果没有,那么根据下面步骤 生成一个!

1.2 生成一个(或多个)SSH-Key

生成一个 Github 用的 SSH-Key,其中 github_id_rsa 为密钥的文件名,~/.ssh/github_id_rsa 为密钥目录位置:

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

利用上述命令,生成了一对秘钥 github_id_rsagithub_id_rsa.pub , 保存在了 ~/.ssh 文件夹内。

生成另一个 SSH-Key,其中 Othergithub_id_rsa 为密钥的文件名,~/.ssh/Othergithub_id_rsa 为密钥目录位置:

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

这时候要特别注意 -f ~/.ssh/Othergithub_id_rsa 用于重命名,否则会覆盖上面的密钥文件。假设生成了一对新的秘钥 Othergithub_id_rsaOthergithub_id_rsa.pub

然后分别将这两对密钥加入到对应的 GitHub 账户中。

本章产生的两个密钥案例如下:
在这里插入图片描述

2. 编辑配置文件

编辑 ~/.ssh/config 文件。如果该文件不存在的话,直接创建一个就好(通过 touch 命令新建 config 文件,并用 vim 编辑器打开 config 文件)。

不同 Host 实际映射到同一 HostName,但密钥文件不同。Host 前缀可自定义,例子中 99Young99

分步解释

Host 99Young99.github.com (自定义的 Host 简称,以后连接远程服务器就可以用 99Young99.github.com 代替 HostName 的 github.com, 相当于网站的别名,随意取,并且可以去掉 github.com 直接取名为 99Young99.github.com)

Host 远程仓库的地址,注意哦,如果有些服务器做的 ip 端口转发,这里不要带上端口号
Host 99Young99.github.com
HostName (托管网站的域名) 是远程仓库的地址,同样如果做的端口转发也不应带端口号 
HostName 主机名可用 ip 也可以是域名(如:github.com或者bitbucket.org)
网上大部分教程的配置文件中 Hostname 都是 github.com,配置成那样可能不能正常 SSH 访问,如果没有成功,改为 ssh.github.com 试一下 (本人没加 ssh 成功了,如下)
HostName github.com
Port 端口号,如果有做转发需要在这里填写端口号,没有就不必要填
Port 服务器 open-ssh 端口 (默认:22,默认时一般不写此行)
Port 8800
PreferredAuthentications publickey
用户
User 登录用户名(如:git) // 即 github 上的用户名
User 99Young99
识别 key 的文件
IdentityFile 证书文件路径(如~/.ssh/id_rsa_*)
IdentityFile ~/.ssh/id_rsa

完整配置

Host 99Young99.github.com
HostName github.com
PreferredAuthentications publickey
User 99Young99
IdentityFile ~/.ssh/id_rsa

配置另一个 Github 账号

都指向同一个平台的话,下面的 Host 需要做个处理,因为我们在用这个 key 的时候根据 Host 从上到下进行查找,不做修改肯定会先查找到第一个 key, 依旧无效,随便改就好了,其他参数不做特殊处理
Host CS-Research-alliance.github.com
HostName github.com
PreferredAuthentications publickey
User CS-Research-alliance 
IdentityFile ~/.ssh/github_id_rsa
网上大部分教程的配置文件中 Hostname 都是 github.com,配置成那样是不能正常 SSH 访问的。

先注意一下: 这里一定是先把两个公钥添加到对应的 GitHub 账户,再进行下面的 ssh 连接测试,否则肯定是连接不上,会显示 permission denied。)

第 1步】首先创建 GitHub 账号并登陆,打开 Setting 进行设置,新建 SSH key

第 2 步】点 New SSH key 后,填上任意 Title,在 Key 文本框里粘贴id_rsa.pub 文件的所有内容:

第 3 步】输入密码进行确认,最后就可以看到,SSH key 添加完成

这时候,可以测试一下配置是否成功,测试命令使用别名。例如,对于 GitHub,本来应该使用的测试命令是:

ssh -T [email protected]

但在 config 文件中,给 GitHub 网站配置的别名就是 CS-Research-alliance.github.com 以及 99Young99.github.com,所以直接使用别名,就是

ssh -T [email protected]
ssh -T [email protected]

出现如下信息说明配置成功了

Hi CS-Research-alliance! You've successfully authenticated, but GitHub does not provide shell access.

在这里插入图片描述

同样的方式就可以配置更多的以 SSH 登录的不同 git 用户。

3. 配置仓库设置

配置仓库是因为这个时候有多个 SSH ,并对应了多个账户,所以每个账户应该在对应仓库配置专属的本地用户名和邮箱,否则默认所有用户均使用的全局用户名和邮箱。

首先要删除 Git 配置的全局用户名和邮件地址,接着在每个项目仓库中按照需求设置不同的 user.nameuser.email

# 查看全局配置
git config --global user.name
git config --global user.email

# 查看本地配置(只能在 git 仓库中使用)
git config --local user.name
git config --local user.email
# 删除全局设置
git config --global --unset user.name
git config --global --unset user.email

# 添加本地设置
# 设置为私有仓库的GitHub账号邮箱和公有账号的GitHub邮箱。
git config --local user.name "个人github账号名"
git config --local user.email "个人github账号邮箱"

对于 Github99Young99 的本地仓库配置如下:

git config --local user.name "99Young99"
git config --local user.email "[email protected]"

对于 GithubCS-Research-alliance 的本地仓库配置如下:

git config --local user.name "CS-Research-alliance"
git config --local user.email "[email protected]"

如果出现如下报错,是因为必须要进入到 git 仓库才可以正常执行命令

fatal: --local can only be used inside a git repository

这一步以及后面的添加远程仓库,每创建一个新的本地仓库的时候,都需要指定,因为全局配置已经删除了

之后在添加远程仓库的时候,把 github.com 修改成 99Young99.github.com 或者 CS-Research-alliance.github.com 就好了(即上述文件中的 Host 选项),用上面两个 Host 名称来代替原来的 github.com,(这一步很重要)如:

git remote add origin [email protected]:xxx/example.git # 99Young99
git remote add origin [email protected]:xxx/example.git # CS-Research-alliance.github

其实,上面的配置文件的意思就是,按照设置远程仓库时使用不同的 Host 名称,查找 ~/.ssh/config 文件,使用不同的 SSH 文件连接到 GitHub。这样你就将是以不同的身份访问 GitHub 仓库。

4. 提交项目到不同的账户

比如提交到 CS-Research-alliance 账户上

初始化本地仓库

git init 

连接远程仓库,注意远程仓库的地址,其中 @ 后默认为 github.com,需要改为 ~/.ssh/config 配置 Host 时的别名,如本人的为:CS-Research-alliance.github.com

git remote add origin [email protected]:CS-Research-alliance/Summer-camp-and-exemption.git # 连接远程仓库

由于 Github 创建分支默认为 main,所以需要将本地的 master 分支改为 main 分支(先看最后的命令解释,再考虑是否执行此句)

git branch -M main

如果远程仓库有内容,包含 README 文件,需要先执行下述命令

git pull --rebase origin master

提交项目

git add .
git commit -m "任意内容"

-u 表示如果远程没有 master 分支,会创建一个 master 分支,并将项目提交上去,也就不需要将本地的 master 分支改为 main 了,否则执行:git push -u origin main

git push -u origin master

References

[1] 一台电脑双GitHub账户配置

[2] 新手如何配置多个 SSH Key(通俗易懂手把手教学)

[3] 怎么给Git配置多个SSH Key?

[4] 一台电脑绑定两个(或多个)github账号

[5] 在一台电脑上配置多个github和gitlab账号

猜你喜欢

转载自blog.csdn.net/qq_46450354/article/details/129997855
今日推荐