美文网首页Android开发Android知识程序员
Git的多SSH Key解决方案(macOS)

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

作者: 洛城夜雨 | 来源:发表于2017-04-30 11:26 被阅读109次

    背景

    公司最近将代码由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

    扩展知识

    相关文章

      网友评论

        本文标题:Git的多SSH Key解决方案(macOS)

        本文链接:https://www.haomeiwen.com/subject/wbtxtxtx.html