227. 多个 GIT 账户共存并支持推送仓库

平时开发过程中可能遇到这样的问题,就是在进行公司的项目开发时要用公司的 git 账号,以及对应的 git 仓库,比如 gitlab 的;对于个人的开源项目,又会有自己的 git 账号,以及对应的 git 仓库,比如 github 或者码云(gitee)。
这时就会遇到多账户提交时的冲突问题,以及对应的多个 ssh key 的管理的问题。

先验知识

  • 查看所有配置及其来源: git config [--global] --list --show-origin
  • 检查配置: git config [--global] --get <credential.helper>

[!NOTE]
如果命令配置后无效,请使用 git config [--global] --list --show-origin 查看所在文件,直接修改文件也可以达到同样的目的. (万物皆文件)

实现

多个 ssh key 的管理

ssh key 的创建

假如有两个 git 账户,分别是 github@example.comgitee@example.com。为了提交 git,我们需要设置对应的 ssh key,ssh key 具体其在对应平台的配置方法比较简单,本文不再详述,可参考对应的资料,这里只是 ssh key 的创建及管理。
在终端输入如下命令:

1
ssh-keygen -t rsa -C "github@example.com"

终端提示如下:

1
2
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/XXX/.ssh/id_rsa):

此时直接回车,就会在 ~/.ssh/ 路径下,创建一个名为 id_rsa 的公钥,这个并不是我们想要的,因为这里要设计多个 ssh key 的管理,这个命名没有任何特征。

在终端中输入如下命令:

1
/Users/XXX/.ssh/id_rsa_github

表示这个是 github 平台的 key,之后根据终端提示,输入并确认密码,就可以生成了。

1
2
3
4
5
6
Enter passphrase (empty for no passphrase): 
Enter same passphrase again:
Your identification has been saved in /Users/XXX/.ssh/id_rsa_github.
Your public key has been saved in /Users/XXX/.ssh/id_rsa_github.pub.
The key fingerprint is:
...

同理,另一个 ssh key 的创建流程如下:

1
2
3
4
5
6
7
8
9
10
ssh-keygen -t rsa -C "gitee@example.com"
# Generating public/private rsa key pair.
# Enter file in which to save the key (/Users/XXX/.ssh/id_rsa):
/Users/XXX/.ssh/id_rsa_gitee
# Enter passphrase (empty for no passphrase):
# Enter same passphrase again:
# Your identification has been saved in /Users/XXX/.ssh/id_rsa_gitee.
# Your public key has been saved in /Users/XXX/.ssh/id_rsa_gitee.pub.
# The key fingerprint is:
...

配置 ssh 代理

创建好了上面的多个 ssh key 就可以开始管理他们了。
在终端中输入如下命令,查询系统 ssh key 的代理:

1
ssh-add -l

如果系统已经设置了代理,需要删除:

1
2
ssh-add -D
# All identities removed.

如果提示:

1
# Could not open a connection to your authentication agent.

执行:

1
exec ssh-agent bash

接下来添加刚才创建的 ssh key 的私钥:

1
2
3
4
5
6
7
8
9
# 第一个
ssh-add ~/.ssh/id_rsa_github
# Enter passphrase for /Users/XXX/.ssh/id_rsa_github:
# Identity added: /Users/XXX/.ssh/id_rsa_github (/Users/XXX/.ssh/id_rsa_github)

# 第二个
ssh-add ~/.ssh/id_rsa_gitee
# Enter passphrase for /Users/XXX/.ssh/id_rsa_gitee:
# Identity added: /Users/XXX/.ssh/id_rsa_gitee (/Users/XXX/.ssh/id_rsa_gitee)

添加公钥

其实就是将对应的.pub 中的内容,复制到对应平台的 ssh key 管理栏目中,不同的平台,位置不同,可以去对应的个人中心的设置中查看,很容易找到。

配置文件 config

在 /.ssh 目录下创建 config 配置文件:

1
vim ~/.ssh/config

熟悉 vim 的可以直接在终端中编辑这个 config 文件,不熟悉的,打开指定目录下新创建的 config 文件,直接文本编辑即可:

1
2
3
4
5
6
7
8
9
10
11
# github配置
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_github

# gitee配置
Host gitee.com
HostName gitee.com
User git
IdentityFile ~/.ssh/id_rsa_gitee

编辑保存后,再次查看 ssh key 的代理:

1
ssh-add -l

如果看到如下,说明设置成功了:

1
2
2048 SHA256:............ /Users/XXX/.ssh/id_rsa_github (RSA)
2048 SHA256:............ /Users/XXX/.ssh/id_rsa_gitee (RSA)

验证 ssh key

终端中输入如下验证命令,如果返回如下,说明配置成功了:

1
2
3
4
5
ssh -T git@github.com
# Hi XXXXXX! You've successfully authenticated, but GitHub does not provide shell access.

ssh -T git@gitee.com
# Hi XXXXXX! You've successfully authenticated, but Gitee.com does not provide shell access.

如果遇到:

1
permission denied (publickey)

就是之前的公钥设置的问题,需要去对应的平台检查下 ssh key 公钥是否设置成功。
至此,ssh key 的配置管理就结束了。

多个 git 账户的提交问题

我们大多数人都会使用第三方工具进行 git 提交,比如 source tree 之类的,这些工具在提交时,如果不对对应的 git 仓库进行专门的配置,会默认走 git 的全局配置,也就是会用默认的全局配置的账户进行 git 提交。一不小心,就会用我们私人的账户,进行了公司项目的 git 提交,生成了对应的提交记录,也有可能因为权限问题,导致直接提交失败。
这时,我们需要对不同的仓库,进行对应的配置。

检查全局配置

在终端中,分别输入如下命令,可以检查目前电脑中的 git 的全局配置信息,如果没有返回,说明没有全局配置,如果有,就可以看到对应的默认的账户是那个了。

1
2
git config --global user.name
git config --global user.email

为了避免麻烦,我们可以取消全局配置:

1
2
git config --global --unset user.name
git config --global --unset user.email

全局配置和局部配置

此时已经取消了电脑中默认的 git 全局配置信息,此时进行 git 提交,会报对应的找不到账户信息的错误。
我们可以 cd 到对应的 git 仓库的根目录下,执行局部 git 配置命令。比如 /Users/XXX/github/DemoProject 是一个在 github 平台托管的本地 git 仓库的根目录,我们可以执行如下命令:

1
2
3
cd /Users/XXX/github/DemoProject
git config user.name
git config user.email

如果返回均为空,说明没有进行过局部配置,可以分别配置 github 的账户名和邮箱:

1
2
git config user.name "github账户名"
git config user.email "github@example.com"

同理,在不同的 git 仓库下,可以分别配置不同平台的 git 账户名和 git 邮箱。这虽然看起来麻烦,不过,只要设置完成,之后只要不再更改对应的 git 仓库的路径,就不需要再更换配置了。

而且,即便我们没有取消默认的全局 git 配置,在进行了局部配置后,后者的优先级会更高。 执行:

1
git config --list

可以查看查看当前仓库的具体配置信息,在当前仓库目录下查看的配置是全局配置 + 当前项目的局部配置,使用的时候会优先使用当前仓库的局部配置,如果没有,才会去读取全局配置。

hexo 部署时的 git 提交问题

因为我们先前取消了电脑中的 git 全局配置,hexo 在部署发布时,可能遇到如下问题:

1
2
3
4
5
6
7
8
9
*** Please tell me who you are.

Run

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

不知道是不是因为 hexo 必须要求读取全局配置,设置了几个文件夹的局部 git 配置,均无效,只好又恢复了全局配置,也就是对应的 github 的账户信息,因为之前提到过,局部配置的优先级大于全局配置,所以不用担心账户冲突的问题,只要设置好对应仓库的局部配置信息,就不用担心全局配置的存在。
当然,这只是折中的方案,如果有人知道如何配置 hexo 仓库的局部配置信息,欢迎指教。

globa 基于 https 管理多个账户的私有仓库

  1. 添加 github 账户的 SSH keys

  2. 新建 github 账户的 token

  3. 按照上面的教程配置多个账户的 ssh key

  4. 使用命令: git clone git@<user_hostname>:<repository_owner>/<repository_name>.git 下载该仓库

  5. 使用命令设置 local 配置

    1
    2
    3
    4
    5
    git config --local user.name <username>         # 设置用户名
    git config --local user.email <usermail> # 设置用户邮箱
    git config --local credential.helper store # 设置存储密钥
    git remote rm origin # 移除远程链接
    git remote add origin <remote_url> # 添加仓库的url
  6. 大功告成

QAs

  • 如果存在无法上传到仓库的问题

    运行命令:

    1
    2
    git config --global --unset user.name
    git config --global --unset user.email
  • Your name and email address were configured automatically based on your username and hostname. Please check that they are accurate.

    你可以运行命令

    1
    2
    git config --local user.name "Your Name"
    git config --local user.email you@example.com

    但是该命令需要在每个仓库都要运行一遍。如果想一劳永逸,那么运行命令:

    1
    2
    git config --global user.name "Your Name"
    git config --global user.email you@example.com

Reference

  1. 一台电脑如何管理多个 SSH KEY
  2. 同一台电脑关于多个 SSH KEY 管理
  3. Git 管理多个 SSH 密钥,Git 多帐号配置
  4. 如何配置多个 ssh key
  5. Git 配置多账号登录不同项目
  6. Git 全局配置和单个仓库的用户名邮箱配置
  7. GIT 常用命令