Git的多SSH Key解决方案(macOS)

背景

公司最近将代码由svn迁移到了gitlab来托管,我个人平时也经常使用Github,可是公司邮箱与我的Github使用的邮箱是不同的,SSH Key是由邮箱来生成的,这样子就造成了冲突,本文记录了解决此类问题的方案。

解决方案

使用 git config工具,对不同的域名采用不同的认证密钥。

  1. 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 文件,将公司项目配置到各自的项目工作目录。

  2. 配置用户名、邮箱

  • 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"
    
  1. 生成SSH Key

mac上SSH 公钥默认储存在账户的主目录下的 ~/.ssh 目录。

$ cd ~/.ssh
$ ls
id_dsa d_dsa.pub known_hosts

关键是看有没有用 somethingsomething.pub 来命名的一对文件,这个 something 通常就是 id_dsaid_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.pubid_rsa.gitlab.pub文件就是给github和gitlab使用的公钥。

  1. 配置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密钥进行验证。

  1. 设置github和gitlab公钥

    以github为例:

    1. 登录https://github.com/
    2. 点击右上角个人头像图标,然后点击Settings选项
    3. 选择SSH and GPG keys选项,然后点击右上角New SSH key按钮
    4. Title填上自定义的名字方便区分即可,然后打开~/.ssh/id_rsa_github.pub文件,将文件的所有内容copy粘贴到key对应的文本域即可

    由于每个公司的gitlab菜单项可能不一样就不举例子了。

  2. 验证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

扩展知识

推荐阅读更多精彩内容