使用场景:

如我有多个git仓库账号,如2个bitbucket账号,一个github账号。我想让不同的git仓库账号使用不同的公私钥对,同时若多个bitbucket或多个github账号配置同一个公钥是不允许的,一个公钥只能配置在一个github或bitbucket账号中。要想解决如上问题,解决方法如下:

解决思路

生成多对私钥/公钥,注意密钥文件命名避免重复
git操作时,可以区分两个账户,推送到相应的仓库
设置不同的Host对应同一个HostName,但密钥不同
取消Git全局用户名/邮箱设置,为每个仓库单独设置 用户名/邮箱

操作

1、创建多对公私钥

注意多对公私钥创建时, -f 和 -C 参数要不同

创建方法如下:

  1. ssh-keygen -t rsa -f ~/.ssh/id_rsa -C "xxx.yyyy@gmail.com"
  2. 解释几个参数:
  3. -t 指定密钥类型,默认是 rsa ,可以省略
  4. -f 指定密钥文件存储文件名(注:~/.ssh/是密钥目录;id_rsa是密钥名,密钥名可以随意)
  5. -C 设置注释文字,比如邮箱(1、这里的C是大写的 2、一定要关联你自己的GitHub的注册邮箱)
  6. 接着它会提示你输入两次密码(该密码是你push文件的时候要输入的密码,而不是GitHub管理者的密码),
  7. 你也可以不输入密码(推荐),直接按回车。那么push的时候就不需要输入密码,可以直接提交到GitHub上:

2、更改本地的SSH配置

用于区分账号,设置不同秘钥

~/.ssh文件夹下新建config文件并编辑,配置Host(自定义账号域名)和HostName(实际git账号域名)、秘钥对应关系。

如果我们有一个bitbucket账号,一个github账号,设置方法如下

  1. vim ~/.ssh/config
  2. #第一个ssh密钥
  3. Host github.com
  4. HostName github.com
  5. PreferredAuthentications publickey
  6. User git
  7. IdentityFile ~/.ssh/id_rsa_github
  8. IdentitiesOnly yes
  9. #第二个ssh密钥
  10. Host bitbucket.org
  11. HostName bitbucket.org
  12. PreferredAuthentications publickey
  13. User git
  14. IdentityFile ~/.ssh/id_rsa_bitbucket
  15. IdentitiesOnly yes

如果我们有两个bitbucket账号,设置方法如下

  1. vim ~/.ssh/config
  2. #第一个ssh密钥
  3. Host git1.bitbucket.org
  4. HostName bitbucket.org
  5. PreferredAuthentications publickey
  6. User git
  7. IdentityFile ~/.ssh/id_rsa_bitbucket_1
  8. IdentitiesOnly yes
  9. #第二个ssh密钥
  10. Host git2.bitbucket.org
  11. HostName bitbucket.org
  12. PreferredAuthentications publickey
  13. User git
  14. IdentityFile ~/.ssh/id_rsa_bitbucket_2
  15. IdentitiesOnly yes

上面git1、git2 为自定义Host前缀。

以上配置文件参数说明:

  1. # Host:对识别的模式,进行配置对应的的主机名和ssh文件
  2. # HostName:登录主机的主机名
  3. # PreferredAuthentications:设置登录方式,publickey公钥,改成password则要输密码
  4. # IdentityFile:私钥全路径名
  5. # User:登录名
  6. # IdentitiesOnly 这个配置yes,表示只使用这里的key,防止使用默认的

3、将两个密钥对中的公钥分别加到两个Git账号配置下

4、克隆新的项目

以两个bitbucket账号为例:

一般情况下,我们是通过如下的方式克隆一个项目:

git clone git@bitbucket.org:your-account/your-prj.git

在我们有两个密钥的情况下(使用非默认密钥时),我们需要对这个语句中的域名部分做一下修改:

git clone git@xxxbitbucket.org/your-prj.git

注意:这里的xxx是你更改本地的SSH配置第二步中的Host,比如的:

git clone git@git2.bitbucket.org:your-account/your-prj.git

这样就可以clone成功了。

若是一个github账号,一个bitbucket账号,那么git仓库地址不需要改变。

5、取消全局 用户名/邮箱设置,每个仓库单独设置

取消全局 用户名/邮箱 配置

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

为每个仓库单独设置 用户名/邮箱

  1. cd YourRepoPath
  2. git config user.name "You Name"
  3. git config user.email name@example.com

其实很简单,就是去掉—global参数就行了

参考文章:
https://www.artjay.me/2019/more-ssh/