由于公司团队使用 GitLab 来托管代码,同时,个人在 Github 上还有一些代码仓库,可公司邮箱与个人邮箱是不同的,由此产生的 SSH key 也是不同的,这就造成了冲突 ,如何在一台机器上面同时使用 Github 与 Gitlab 的服务?
具体场景
无论使用哪种代码托管服务商,对于 Git 而言,邮箱
是识别用户的唯一手段,所以对于不同的服务商,由于邮箱不同,那么通过邮件名创建的 SSH Key 自然是不同的,这时候在不同的服务商之间进行push
命令的时候,Git 是不知道使用哪个 SSH Key ,自然导致 push
的失败。场景如下:
- 在公司团队使用搭建的 Gitlab 服务,提交邮箱
company@xxx.com
。个人 Github 服务,提交邮箱personal@qq.com
。 - 有两个Github账户,不同的账户提交不同的仓库内容。
解决方案
方案一:同一个邮箱
由于邮箱
是识别的唯一手段,那么自然的,这两者采用同一个邮箱,生成的 public key 也会是同一个,上传到 Github 或者 Gitlab 上面,在 Git 的配置中 ,设置好 Global 的配置 :git config --global user.name 'Voluee' && git config --global user.email 'personal@xxx.com'
进行日常的开发是没有问题的。
实际生活中采用同一个邮箱的可能性并不是太大,这就引出了方案二
方案二:基于config文件
所谓的方案二,原理上就是对 SSH 协议配置 config 文件,对不同的域名采用不同的认证密钥。
配置流程
# 全局配置,Github仓库中默认使用此配置
git config --global user.name "Voluee" && git config --global user.email "personal@xxx.com"
# 团队项目配置,每次新创建一个项目,需要执行下
git config --local user.name "Voluee" && git config --local user.email "company@xxx.com"
2.生成 ssh key 上传到 Github/Gitlab
ssh key 默认生成后保存在 ~/.ssh/目录下 ,分别为gitlab_id_rsa和github_id_rsa两个文件,由于我们需要分开配置,所以这么做:
#创建gitlab的SSH-Key
ssh-keygen -t rsa -C "company@xxx.com" -f ~/.ssh/gitlab_id_rsa
#创建github的SSH-Key
ssh-keygen -t rsa -C "personal@xxx.com" -f ~/.ssh/github_id_rsa
命令执行完成后,这时~/.ssh
目录下会多出gitlab_id_rsa
和github_id_rsa
四个文件,xxx.pub
里保存的就是我们要使用的key,这个key就是用来上传到Gitlab和GitHub上的。
3.配置 config 文件
在 ~/.ssh
目录下,如果不存在,则新建 touch ~/.ssh/config
文件 ,文件内容添加如下:
#gitlab
Host [这里填gitlab真实地址,就是clone的前缀]
HostName [这里填gitlab真实地址]
PreferredAuthentications publickey
IdentityFile ~/.ssh/gitlab_id_rsa
#github
Host github
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github_id_rsa
4.上传public key 到 Github/Gitlab
以Github为例,过程如下:
-
登录github --> 点击右上方的头像选择settings图标 --> 点击左边界面的 SSH keys —> 点击New SSH key
–> 然后将上面拷贝的 ~/.ssh/github_id_rsa 文件内容粘帖到key一栏,再点击“Add SSH key”按钮就可以了
-
添加过程github会提示你输入一次你的github密码 ,确认后即添加完毕。
5.验证是否OK
由于每个托管商的仓库都有唯一的后缀,比如 Github的是 git@github.com:*
,所以可以这样测试:
ssh -T git@github.com
Hi ciqing! You've successfully authenticated, but GitHub does not provide shell access.
ssh -T git@[这里填gitlab真实地址,就是clone的前缀]
Welcome to GitLab, Voluee!
看到这些Welcome
信息,说明就是OK的了
分享一些指令
git config --list
git config --system --list
git config --global --list
git config --local --list
CMD,git_bash不走代理,所以得配置,前提是你有vpn已经代理了指定端口
set http_proxy=http://127.0.0.1:1080
set https_proxy=http://127.0.0.1:1080
export set https_proxy=http://127.0.0.1:1080
分开配置仓库
假设gitlab与jgithub的工作目录分别如下所示:
github工作仓库:~/workspace/github
gitlab工作仓库:~/workspace/gitlab
#gitlab
cd ~/workspace/gitlab
git init
git config --global user.name 'gitlab'
git config --global user.email 'gitlab@company.com'
#github
cd ~/workspace/github
git init
git config --local user.name 'personal'
git config --local user.email 'personal@163.com'