引言

在进公司实习之前,虽然为了方便存储自己的练习代码,配置了Github的ssh,但电脑上的ssh也只有自己的私人账户,而且刚进公司的时候项目组的大部分东西都还在svn上,两者不冲突不打架,就没怎么考虑过config配置ssh的问题。最近大规模迁移到gitlab和独立域名的时候,查看推送的时候发现显示推送对象是私人账号,而且有时会出现Permission Denied的情况,于是便开始补课ssh-config,总结成这篇博客,希望可以加深自己的印象。

生成公私钥并配置到Github账户

防止覆盖地以邮箱生成rsa类型的公私钥

ssh-keygen -t rsa -C "emailaddress@example.com" -f keyname

由于使用vim打开复制时存在vim自动添加的\t,加入Github的ssh配置时如果不想自己手动删掉,可以使用Sublime打开。但由于Sublime在默认的/Applications下没有直接使用命令行打开的连接,所以需要手动设置之后再使用Sublime打开。

ln -s /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl /usr/local/bin/sublime

之后就可以在终端用命令启动sublime了SublimeCommand启动文档代码。使用config文件对不同的仓库配置相应的sshKey。

较多账户常见的状况

  1. 公司使用独立域名了的云服务器上的Git仓库(公司配给的账号
  2. 公司在Github上拥有公开的项目或GitLab上项目的拷贝(个人独立账号,公司配给账号均可
  3. 基于以上情况,自己又拥有对应Git站点账号,频繁登陆GitLab、Bitbucket或Github等个人仓库(个人独立账户
  4. 拥有同一网站的多个账号并需要对不同账号所属的仓库进行push操作同网站多账号进行push操作时的Permission denied由于登陆github时,会检查对应账号下是否存在ssh的公钥权限。所以需要配置git config文件。
git config --global user.name "Github Login Name"
git config --global user.email "Github_Login@E-mail.com"

并使用git config --global --list检查配置,该设置成功时使用ssh -T git@github.com时,出现的提示信息Hi,XXX!使用的称谓即为Github账号名。但该操作容易导致常见状况的No.4出现Permission denied的情况。处理方式是使用git config –local解决多账号冲突。

公司的一个项目拥有多个仓库地址(不同站点的同一项目)

  1. 使用公司账号配置该账号在config中的设置

假设公司的某一项目在上述地址拥有项目的拷贝。那么在.ssh中的config设置中,可以配置相同的sshkey(下方最后的gitLabCompanyAccount主要是为能在clone的时候和个人账户区分开,保证ssh检查权限时检查对应的配置文件,详见同网站不同账号的不同仓库项目配置)

  1. config文件
Host 192Repo
    HostName https://192.168.1.1
    User git
    IdentityFile ~/.ssh/id_rsa_company

Host 127Repo
    HostName https://127.0.0.1
    User git
    IdentityFile ~/.ssh/id_rsa_company

Host company
    HostName https://www.company.middle.com
    User git
    IdentityFile ~/.ssh/id_rsa_company

Host gitLabCompanyAccount
    HostName https://www.gitlab.com/companyRepo
    User git
    IdentityFile ~/.ssh/id_rsa_company
  1. 使用拥有公司权限的git账号添加不同的仓库地址进行推送时,可以使用git remote add newRepoName Host:RepoName.git将这些仓库都加入引用,方便统一push,也可以手动变成.git/.config中的origin方便在缺省的情况下全部推送。

    同网站不同账号的不同仓库权限问题

    此情况适用于形如:GitHub下有公司账号,自己的多个私人账号,此时又不希望多个账号之间的ssh相互冲突。可以设置不同的Host名称,在clone时使用Host名称进行操作,保证权限检查的正确。以上面最后一个情况+私人账号为例,可以做如下配置:
Host gitLabCompanyAccount
    HostName https://www.gitlab.com/companyRepo
    User git
    IdentityFile ~/.ssh/id_rsa_company

Host gitLabAccount001Name
    HostName https://www.gitlab.com/privateAccount001
    User git
    IdentityFile ~/.ssh/id_rsa_privateAccount001

Host githubAccount01Name
    HostName https://www.github.com/git01Name
    User git
    IdentityFile ~/.ssh/id_rsa_git001

Host gitLabAccount02Name
    HostName https://www.github.com/git02Name
    User git
    IdentityFile ~/.ssh/id_rsa_git001
  1. 前两个是同在GitLab下时,使用相应账号生成的ssh公钥配置的一个公司账号一个私人账号,后两个是Github下的两个私人账号。HostName中网站后面加上对应的用户名来确保不会有任何一个ssh覆盖到Github或者GitLab的全局ssh权限设置,因为每个Host都只管对应的账号或者仓库。
  2. 使用配置时:克隆公司项目时可以使用git clone gitLabCompanyAccount:SubRepoName.git,而操作自己的私人账号则可以使用git clone gitLabAccount001Name:SubRepoName.git

结语

虽然这次知道怎么用了,但究其ssh-config检验机制的原理和实现流程还是处于似是而非的阶段。打算这次春节的时候,再好好学习一下.



版本管理 Git

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!