虽个人项目不一定会有 >=2 个账号,但是加上公司的 git 账号,那就一定会有 2 枚 git 账号了,如何配置自动切换使用 git 账号非常重要。

笔者拥有个人 git 账号 2 枚,公司 git 账号 1 枚,在设置自动切换以前,每次都要在 clone 下项目之后,小心翼翼地再检查一下,当前项目用的是哪个 git 账号,以避免误用其他账号进行改动推送。

结果就是太麻烦了!难道 geek 没有办法解决这个蛋疼的问题吗?有的,接下来和笔者一起操作吧!

澄清远仓账号与本地 git 账号

远仓账号 是我们登录远程代码托管仓库的账号。
本地 git 账号 是我们要提交改动到远仓的一个身份和依据。

远程仓库账号与本地之间添加 SSH 信任

远程仓库为了保证代码的安全性,只会允许添加了 SSH 信任的用户进行 push 改动。

首先,设置git的username和email:

1
2
$ git config --global user.name "yourname"
$ git config --global user.email "youremailname@email.com"

解释下,usernameemail 是为了以后每一次 commit 代码时,方便 git 去记录,后续我们查看 git 日志记录时就能知道是谁进行的操作,还可以根据 email 对作者进行联系。你可以随便设置,但还是要负责任的写。

--global 参数是对当前用户进行全局设置,这样就不用每新建一个仓库就设置一遍了,但也可以单独对一个仓库进行设置,不添加 --global 参数即可,默认就是 --local

然后,本地生成 SSH 秘钥公钥对:

1
$ ssh-keygen -t rsa -C "youremailname@email.com"

接着一路回车即可。最后会得到两个文件:

  • id_rsa:保存私钥的文件
  • id_rsa.pub:保存公钥的文件

id_rsa.pub 里面的内容全部复制下来,粘贴到远程代码托管仓库(例如:github)个人账号设置里面,新增的 SSH Keys 当中。

PS: windows 上和 mac 上默认保存该生成的秘钥对的位置都一样,为 ~/.ssh/id_rsa~/.ssh/id_rsa.pub

多个远仓账号操作时的 ssh 自动切换

上面设置 SSH 密钥匹配的,通常只适用于在同一个域名的远程代码托管服务提供商(例如:github)下,只有一个账号的情景。即比如说,我在 github 上只有 `CyberA@email.com` 一个账号。

但是,如果我在 github 上有 >=2 个账号了,分别为 `CyberA@email.comCyberB@email.com` 等等,那就不能使用同一套 SSH Key 了。因为通信的时候,凭借相同的 SSH Key 无法判断是 CyberA 还是 CyberB。

假设我有一台 mac,一开始有一个 github 账号 `CyberA@email.com,起初在mac上生成了一份id_rsaid_rsa.pub的ssh密钥对,但是一个密钥对只能在一个 github 账号上使用一次;当开通了第二个 github 账号CyberB@email.com` 账号,再添加原来的密钥对时会提示已经被使用了。

这时候就要再创建一份密钥对,而且不能覆盖原来的,而且向不同的 github 账号下的仓库进行代码推拉操作时,要求可以自动切换使用配置好的 ssh 密钥对。

原来已经有一份默认的ssh密钥对位于~/.ssh/目录下,现创建第二份:

  1. 生成第二份ssh密钥对

    1
    2
    # 使用同第一个邮箱也是可以的,表明两个远仓账号下的仓库作者都是同一人
    ssh-keygen -t rsa -C "youremailname_2@email.com"

    放置于~/.ssh/下,命名为id_rsa_2id_rsa_2.pub,不要覆盖掉原来的

  2. 添加到新账号的ssh keys下
    登录 github,添加公钥到 ssh keys 选项页面中
  3. 添加新密钥对到ssh系统中

    1
    ssh-add ~/.ssh/id_rsa_2
  4. 创建config文件

    1
    vim ~/.ssh/config

    键入如下类似内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa

    Host irm.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_2
  5. 进行测试

    1
    2
    3
    4
    # 测试第一份ssh key
    ssh -T git@github.com
    # 测试第二份ssh key
    ssh -T git@irm.github.com

    如果出现 Hi xxx!You've successfully authenticated 就说明连接成功了。

注意到第 4 步,Host github.comHost irm.github.com 非常有用,是区分不同账号对不同的 GitHub 仓库请求的依据,其中两段代码的 HostName 还是指向 github.com 域名的,但是 IdentityFile 区分了使用哪个 SSH Key;因此 Host 就是用来区分自动切换使用哪个 SSH Key 的。

如果我们之前没有区分不同账号下的仓库,导致提交报错,那么可以进行如下类似配置:

  • `ironmax@163.com` 账号对应的仓库下的代码,在本地应如下配置:

    1
    2
    3
    4
    # 移除原来的远程仓库地址
    $ git remote remove origin
    # 根据以上配置,修正远程仓库地址
    $ git remote add origin git@github.com:ironmaxtory/irm-cli.git
  • `irm_github@163.com`账号对应的仓库下的代码,在本地应如下配置:

    1
    2
    3
    4
    # 移除原来的远程仓库地址
    $ git remote remove origin
    # 根据以上配置,修正远程仓库地址
    $ git remote add origin git@irm.github.com:irm-github/webpack-simple.git

如果想一开始就如下操作,可以省去修正的步骤:

1
2
# 最好的方法就是 clone 远程仓库的时候,就定好
git clone git@irm.github.com:irm-github/webpack-simple.git

复杂工作环境下自动切换应用 git 账户

git 的配置可以在三个地方进行:

  • /etc/gitconfig:本机系统配置,对所有用户生效
  • ~/.gitconfig:用户配置,仅当前用户生效
  • <项目文件夹路径>/.git/config:项目配置,仅当前项目生效

配置权重逐级递增。

一般我们都是针对这 3 个配置文件进行 git 用户的配置,比如像如下:

1
2
3
4
$ git config --global user.name "youremailname@email.com"

# 或者在项目文件下
$ git config user.name "youremailname@email.com"

工作环境不复杂还好。

如果同时存在公司和个人的工作环境,那么每次 clone 的时候都需要自己去判断到底是公司还是个人的项目,然后来修改 git 用户配置。接下来,解决这个痛点!

早在 2017 年中,git 发布的新版本就开始支持在配置文件中,设置不同文件目录使用不同的配置文件,且共享用户配置。

大家来看我的配置 ~/.gitconfig

1
2
3
4
5
6
7
8
9
[color]
ui = true
[user]
name = ironmax
email = ironmax@163.com
[includeIf "gitdir:~/Code/"]
path = ~/.gitconfig_peronal
[includeIf "gitdir:~/WorkCode/"]
path = ~/.gitconfig_career

以上的配置说明:

  • ~/Code/ 目录下的所有项目,都应用 ~/.gitconfig_peronal 配置文件
  • ~/WorkCode/ 目录下的所有项目,都应用 ~/.gitconfig_career 配置文件

接下来看一下这两份配置文件的内容。
~/.gitconfig_peronal

1
2
3
[user]
name = ironmax
email = ironmax@163.com

`~/.gitconfig_career:

1
2
3
[user]
name = hefafa
email = hefafa@company.com

参考链接