背景
公司最近将代码由svn迁移到了gitlab来托管,我个人平时也经常使用Github,可是公司邮箱与我的Github使用的邮箱是不同的,SSH Key是由邮箱来生成的,这样子就造成了冲突,本文记录了解决此类问题的方案。
- 公司GitLab服务邮箱 zhouyang@xxx.com
- 个人GitHub服务邮箱 lyzhou1107@163.com
解决方案
使用 git config
工具,对不同的域名采用不同的认证密钥。
-
git config介绍
Git 提供了一个叫做
git config
的工具,专门用来配置或读取相应的工作环境变量。而正是由这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:- /etc/gitconfig
文件:系统中对所有用户都普遍适用的配置。若使用
git config时用
--system` 选项,读写的就是这个文件。 -
~/.gitconfig
文件:用户目录下的配置文件只适用于该用户。若使用git config
时用--global
选项,读写的就是这个文件。 - 当前项目的 Git 目录中的配置文件(也就是工作目录中的
.git/config
文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以.git/config
里的配置会覆盖/etc/gitconfig
中的同名变量。
由于经常使用GitHub看一些开源项目,相对公司的GitLab项目来说还是多一些的,所以将GitHub的配置到
~/.gitconfig
文件,将公司项目配置到各自的项目工作目录。 - /etc/gitconfig
-
配置用户名、邮箱
- GitHub配置
$ git config --global user.name "zhouyang-cn" $ git config --global user.email "lyzhou1107@163.com"
- GitLab配置
进入项目的根目录$ git config user.name "zhouyang" $ git config user.email "zhouyang@xxx.com"
-
生成SSH Key
mac上SSH 公钥默认储存在账户的主目录下的 ~/.ssh
目录。
$ cd ~/.ssh
$ ls
id_dsa d_dsa.pub known_hosts
关键是看有没有用 something
和 something.pub
来命名的一对文件,这个 something
通常就是 id_dsa
或 id_rsa
。有 .pub
后缀的文件就是公钥,另一个文件则是密钥。假如没有这些文件,或者干脆连 .ssh
目录都没有,可以用 ssh-keygen
来创建。
localhost:~ zhouyang$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/zhouyang/.ssh/id_rsa): 直接敲enter键
Enter passphrase (empty for no passphrase): 直接敲enter键
Enter same passphrase again: 直接敲enter键
Your identification has been saved in /Users/zhouyang/.ssh/id_rsa.
Your public key has been saved in /Users/zhouyang/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:bg5l5i95JIYr9ovvWbPPlAaa2kGljKcBJuu16YTbqBw zhouyang@localhost
The key's randomart image is:
+---[RSA 2048]----+
| |
| |
|. o . |
| + . o o |
|. .o =.S |
|. o o=.Oo... |
| E +. =o*++ |
|. B o+.BoB. |
|o+ +o=B.o++ |
+----[SHA256]-----+
通过上面的操作会在账户的主目录下生成 ~/.ssh
目录,并在目录内生成id_rsa(私钥,切记不要泄露)和id_rsa.pub(公钥)文件。
-
生成GitHub的SSH公钥
ssh-keygen -t rsa -f ~/.ssh/id_rsa.github -C "lyzhou1107@163.com"
-
生成GitLib的SSH公钥
ssh-keygen -t rsa -f ~/.ssh/id_rsa.gitlab -C "zhouyang@xxx.com"
命令执行完成后,这时~/.ssh
目录下会多出id_rsa.github.pub
和id_rsa.gitlab.pub
文件就是给github和gitlab使用的公钥。
-
配置config文件
通过touch ~/.ssh/config
命令创建config文件,修改文件内容如下:
#
# github
#
Host github.com
IdentityFile ~/.ssh/id_rsa_github
#
# company gitlab
#
Host git.company.com
IdentityFile ~/.ssh/id_rsa_gitlab
配置完成以后,github的仓库会使用~/.ssh/id_rsa_github
密钥进行验证,gitlab会使用~/.ssh/id_rsa_gitlab
密钥进行验证。
-
设置github和gitlab公钥
以github为例:
- 登录https://github.com/
- 点击右上角个人头像图标,然后点击Settings选项
- 选择SSH and GPG keys选项,然后点击右上角New SSH key按钮
- Title填上自定义的名字方便区分即可,然后打开
~/.ssh/id_rsa_github.pub
文件,将文件的所有内容copy粘贴到key对应的文本域即可
由于每个公司的gitlab菜单项可能不一样就不举例子了。
-
验证SSH连接
打开Terminal,输入一下命令来校验:
ssh -T git@github.com
若看到如下信息,则代表连接成功了:
Hi zhouyang-cn! You've successfully authenticated, but GitHub does not provide shell access.
若出现问题,可以参考github的文档
在AS中的Problems and solutions
经过上面的配置后,在as里进行代码修改、commit和push操作时,会出现push失败的问题,错误信息如下:
Failed with error: fatal: Could not read from remote repository
通过google搜索后找出问题产生的原因:
由于AS默认使用的是Built-in(自带的)进行SSH校验,而我们上面设置的是mac本机的SSH校验。所以解决方案如下:
相关文档:stackoverflow