前言
本人搞了两个 GitHub 账号,一个用来正常的和别人合作项目,另一个用来自己写一些代码,希望能做到两个本地账户和远程账号都完全隔离,没有联系,也不会被混淆使用。
但是这样就会有一个问题,设置本地用户
user.email
时候,如果两个
GitHub
账号仓库使用同一个本地用户,
GitHub
会将本地的用户自动与相应的
GitHub
账号关联起来,这样在
commit
记录里面就能看到是谁提交的了,这是我不想看到的结果。
最开始以为只要把同一个
SSH
公钥分别添加到两个
GitHub
账户,再在不同的仓库设置不同的
user.name
和
user email
就 OK 了. 并不行,每个公钥只能用一次。然后就考虑生成两个密钥,分别添加到不同的账户,但是电脑在连接远程仓库时,只能默认选择其中固定的一个来连接,并不会根据不同仓库的设置选择不同的密钥,结果就是还是只能免密连接一个
GitHub
账户的仓库。
你所使用的
SSH
密钥决定了你是否有权限访问某一个
GitHub
账号下面的仓库,而你本地仓库设置的
use email
决定了在
GitHub
的
commit
记录中的用户,而一般在没有进行以下配置的情况下,你的电脑只会默认使用一个
SSH
密钥进行连接,这就导致了你只能访问一个
GitHub
账号。
如果访问另一个
Github
账户,在
push
时就会报如下错误:
下面将详细介绍方法:
假设现有两个账号分别如下: 一个账号名为
99Young99
、另一个为
CS-Research-alliance
注: 这里举例实现在相同的平台 Github 不同账号使用不同的 SSH,也可以用相同的方法,在不同的平台使用不同的 SSH
1. 生成密钥
首先是先生成两个
SSH
密钥,对应两个身份(假设为
99Young99
和
CS-Research-alliance
)。
1.1 检查是否已经有 SSH-Key
打开
Git bash
(Linux 中需要打开 Shell),进入
~/.ssh
目录,通过命令看看电脑上有
SSH-Key
的相关文件没!
cd ~/.ssh
ls
如果显示
id_rsa
和
id_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_rsa
和
github_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_rsa
和
Othergithub_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.name
和
user.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账号邮箱"
对于
Github
为
99Young99
的本地仓库配置如下:
git config --local user.name "99Young99"git config --local user.email "[email protected]"
对于
Github
为
CS-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 # 99Young99git 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
提交项目
gitadd.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账号
版权归原作者 青年有志 所有, 如有侵权,请联系我们删除。