由于公司团队使用 GitLab 来托管代码,同时,个人在 Github 上还有一些代码仓库,可公司邮箱与个人邮箱是不同的,由此产生的 SSH key 也是不同的,这就造成了冲突 ,文章提供此类问题的解决方案:如何在一台机器上面同时使用 Github 与 Gitlab 的服务?
如果采用ssh 协议
或者git 协议
通过终端命令对远程仓库进行push
操作的时候,大概的过程如下:(前提在 Github 上已经配置的本机的 SSH Public Key)
关于 SSH,请查看 SSH原理简介 ,更通俗易懂的文章请查看阮一峰-SSH原理与运用(一):远程登录 。
无论使用哪种代码托管服务商,对于 Git 而言,邮箱
是识别用户的唯一手段,所以对于不同的服务商,由于邮箱不同,那么通过邮件名创建的 SSH Key 自然是不同的,这时候在不同的服务商之间进行 push
命令的时候,Git 是不知道使用哪个 SSH Key ,自然导致 push
的失败。场景如下:
xirong.liu@corp.xx.com
, 个人 Github 服务,提交邮箱 ixirong.liu@gmail.com
(Bitbucket 同理)。由于邮箱
是识别的唯一手段,那么自然的,这两者采用同一个邮箱,生成的 public key 也会是同一个,上传到 Github 或者 Gitlab 上面,在 Git 的配置中 ,设置好 Global 的配置 : git config --global user.name 'xirong.liu' && git config --global user.email 'xirong.liu@corp.xx.com'
进行日常的开发是没有问题的。
实际生活中采用同一个邮箱的可能性并不是太大,这就引出了方案二
所谓的方案二,原理上就是对 SSH 协议配置 config 文件,对不同的域名采用不同的认证密钥。
Git有一个工具被称为git config,它允许你获得和设置配置变量;这些变量可以控制Git的外观和操作的各个方面。这些变量可以被存储在三个不同的位置:
--system
’ 给 git config,它将明确的读和写这个文件。--global
’ 选项使Git 读或写这个特定的文件。--local
’选项使Git 读或写这个特定的文件。由于采用了不同的邮箱,对不同的服务商进行提交,所以此时我们经常配置的 git config --global
就不能常用了,必须在每个仓库的目录下进行配置自己的用户名、邮箱。(嫌麻烦?xirong 是这么解决的,由于个人的 Github 上有较多的仓库,而自己团队的代码基本上都是稳定的,有数的几个,所以在 git config --global user.email 'ixirong.liu@gmail.com'
中全局配置的是个人邮箱,在团队的项目中配置)
如刚才所说,xirong 的配置如下:
# 全局配置,Github仓库中默认使用此配置
git config --global user.name 'xirong' && git config --global user.email 'ixirong.liu@gmail.com'
# 团队项目配置,每次新创建一个项目,需要执行下
git config --local user.name 'xirong.liu' && git config --local user.email 'xirong.liu@corp.example.com'
ssh key 默认生成后保存在 ~/.ssh/
目录下 ,默认为 id_rsa 和 id_rsa.pub
两个文件,由于我们需要分开配置,所以这么做:
# 生成公钥、密钥的同时指定文件名,Gitlab使用
ssh-keygen -t rsa -f ~/.ssh/id_rsa.gitlab -C "xirong.liu@corp.example.com"
# 生成默认,Github使用
ssh-keygen -t rsa -C "ixirong.liu@gmail.com"
命令执行完成后,这时~/.ssh
目录下会多出id_rsa.gitlab
和id_rsa.gitlab.pub
两个文件,id_rsa.gitlab.pub
里保存的就是我们要使用的key,这个key就是用来上传到 Gitlab上的。
在 ~/.ssh
目录下,如果不存在,则新建 touch ~/.ssh/config
文件 ,文件内容添加如下:
Host corp.example.com
HostName git.corp.example.com
IdentityFile ~/.ssh/id_rsa.gitlab
User xirong.liu
Host
参数是命令行给出的主机名,比如ssh -T git@corp.example.com
,那么此时的主机(Host
)就是corp.example.com
Host
匹配之后,SSH
把git@corp.example.com
转换成git.corp.example.com
Host
不支持*
和主机名混用,即*.example.com
;单独*
表示匹配所有主机,也就是默认规则HostName
应该是必须填写的内容,根据你使用的命令行内容来填写配置完成后,符合git.corp.example.com
的 Git 仓库,均采取 ~/.ssh/id_rsa.gitlab
密钥进行验证,其它的采取默认的。
以Github为例,过程如下:
在出现的界面中填写SSH key的名称,填一个你自己喜欢的名称即可,然后将上面拷贝的~/.ssh/id_rsa.pub
文件内容粘帖到key
一栏,在点击“add key
”按钮就可以了。
添加过程github会提示你输入一次你的github密码 ,确认后即添加完毕。 上传Gitlab的过程一样,请自己操作。
由于每个托管商的仓库都有唯一的后缀,比如 Github的是 git@github.com:*
,所以可以这样测试:
➜ ~ ssh -T git@github.com
Hi xirong! You've successfully authenticated, but GitHub does not provide shell access.
➜ ~ ssh -T git@gitlab.dev
Welcome to GitLab, xirong.liu!
看到这些 Welcome
信息,说明就是 OK的了。
以后,如果还有任何的需求,都可以这么解决,看下 xirong 的几个托管仓库:
➜ ~ ll ~/.ssh
total 40
-rw-r--r-- 1 xirong staff 264 Jul 10 14:42 config
-rw------- 1 xirong staff 3243 Jul 10 14:09 id_rsa
-rw------- 1 xirong staff 1675 Jan 28 20:39 id_rsa.gitlab
-rw-r--r-- 1 xirong staff 407 Jan 28 20:39 id_rsa.gitlab.pub
-rw-r--r-- 1 xirong staff 747 Jul 10 14:09 id_rsa.pub
-rw------- 1 xirong staff 1679 Jun 22 11:42 id_rsa_gitcafe
-rw-r--r-- 1 xirong staff 407 Jun 22 11:42 id_rsa_gitcafe.pub
-rw-r--r-- 1 xirong staff 9139 Jul 29 15:08 known_hosts
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。