Git 账号在一台电脑关联多个版本仓库 | Git 多账号 ssh-key 管理 | Github 和 Gitlab 共同使用
问题
使用电脑已存在的 ssh-key 直接添加到版本仓库,这是新手配置时候很容易犯的错误。
相关报错:OpenSSL SSL_read: Connection was reset, errno 10054
Bug0015
场景
在一台电脑上登录 git,但是要操作多个版本仓库如 GitLab 和 GitHub,但是版本仓库的邮箱可能不一样。
原因/解析
两个版本仓库添加同一个 ssh-key,会导致一个 ssh-key 的邮箱不对。
如何生成 ssh-key ,下文解决方案第一步给出。
代码托管网站主要看 email( email邮箱涉及到 Git 这个版本控制工具邮箱和版本仓库 GitLab 或者 GitHub 绑定的邮箱)来识别身份,用自己的版本控制工具 Git 的 email 地址来匹配版本仓库 GitLab 或者 GitHub 账户名的邮件地址,如果相同,代码托管网站就认为此操作是账户所有者的操作。比如:
如果本地设定的user.email值是:personal@126.com,由于在GitHub上的账户的邮件地址也是personal@126.com,如果从这台电脑push的话,GitHub会认定这次这个push是账户拥有者自己做的,跟直接登录到GitHub,从网站上修改,是相同的,修改人是一样,就是账户拥有者。
这篇文章对Git用户名与Github账户关系的理解,对用户名邮箱等分析的可以说比较透彻。也是解决 github 和 gitlab 共同使用关键。
解决方案
思路
1、为 Github 和 Gitlab(两个及以上 GitHub 账号同理) 生成不同的 ssh-key,并给予不同的命名如下,保存到指定位置。
2、添加ssh-key到版本仓库(Github、Gitlab、Gitee)
步骤
1个 Github + 一个 Gitlab
1、生成ssh-key
进入命令行输入如下指令,生成ssh-key
# 为 github 生成ssh-key -f 后面是指定生成文件名字
ssh-keygen -t rsa -C "github 绑定的邮箱" -f C:/Users/xxx/.ssh/id_rsa_github
# id_rsa_github.pub是github的ssh-key
# 为gitlab生成ssh-key
ssh-keygen -t rsa -C "gitlab 绑定的邮箱" -f C:/Users/xxx/.ssh/id_rsa_gitlab
# id_rsa_gitlab.pub是 gitlab 的 ssh-key
2、创建 config 文件
在 .ssh 文件夹下创建 config 文件,注意无后缀就直接命名 config
令不同 Host 实际映射到同一 HostName,但密钥文件不同。
Host github
HostName github.com
IdentityFile ~/.ssh/id_rsa_github
Host gitlab
#HostName [IP or host]
HostName 1xx.6x.xx.xx
IdentityFile ~/.ssh/id_rsa_gitlab
Host github2
HostName github.com
IdentityFile ~/.ssh/id_rsa_github2
配置文件解析
#Host myhost(myhost为自定义的host简称,连接远程服务器就可以用命令ssh myhost)[注意下面有缩进]
#User 登录用户名/账号邮箱(如:git/xxxxx2@xx.com)
#HostName 主机名可用ip也可以是域名(如:github.com)
#Port 服务器open-ssh端口(默认:22,默认时一般不写此行)
#IdentityFile 证书文件路径(如~/.ssh/id_rsa_*)
3、测试连接
测试连接是否成功,执行命令并出现下面情况说明成功!
ssh -T git@gitlab
# 出现:Welcome to GitLab, 用户名!
ssh -T git@github #ssh -T git@github.com 也可,但是注意两个GitHub账号就不能区分了,下文有介绍
# 出现:Hi 用户名! You've successfully authenticated, but GitHub does not provide shell access.
两个GitHub账号时建议(原理同上)
注意此时ssh -T git@github.com
如果配置两个github账号时会有报错,很明显生活显而易见的。
因此配置时建议入下:
Host github1.github.com
HostName github.com
User xxxxx@xx.com # 账号邮箱
IdentityFile ~/.ssh/id_rsa_github
Host github2.github.com
HostName github.com
User xxxxx2@xx.com # 第二套账号邮箱
IdentityFile ~/.ssh/id_rsa_github2
测试连接
ssh -T git@github1.github.com
ssh -T git@github2.github.com
其他优化
配置仓库, 让不同仓库的项目工作在不同目录
假如公司电脑 gitlab 用的比较多,gitlab 配置,可以全局配置
git config --global user.name 'username'
git config --global user.email 'username@gmail.com' # 这里是公司gitlab用的邮箱
而对于 github 配置,可以单独创建一个目录,在该目录下存放github上的代码
cd E:/ProFiles/指定目录
git init
git config --local user.name 'username'
git config --local user.email 'username@gmail.com' # 这里是github用的邮箱