由于公司团队使用 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 文件,对不同的域名采用不同的认证密钥。

配置流程

1. 配置 Git 用户名、邮箱

# 全局配置,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_rsagithub_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'