Skip to main content

.一台电脑上不同的Git仓库账号使用不同的公私钥设置

使用场景:

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

解决思路

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

操作

1、创建多对公私钥

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

创建方法如下:

ssh-keygen -t rsa -f ~/.ssh/id_rsa -C "xxx.yyyy@gmail.com"
解释几个参数:

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

2、更改本地的SSH配置

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

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

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

vim ~/.ssh/config

#第一个ssh密钥
Host github.com
HostName github.com
PreferredAuthentications publickey
User git
IdentityFile ~/.ssh/id_rsa_github
IdentitiesOnly yes

#第二个ssh密钥
Host bitbucket.org
HostName bitbucket.org
PreferredAuthentications publickey
User git
IdentityFile ~/.ssh/id_rsa_bitbucket
IdentitiesOnly yes

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

vim ~/.ssh/config

#第一个ssh密钥
Host git1.bitbucket.org
HostName bitbucket.org
PreferredAuthentications publickey
User git
IdentityFile ~/.ssh/id_rsa_bitbucket_1
IdentitiesOnly yes

#第二个ssh密钥
Host git2.bitbucket.org
HostName bitbucket.org
PreferredAuthentications publickey
User git
IdentityFile ~/.ssh/id_rsa_bitbucket_2
IdentitiesOnly yes

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

以上配置文件参数说明:

# Host:对识别的模式,进行配置对应的的主机名和ssh文件
# HostName:登录主机的主机名
# PreferredAuthentications:设置登录方式,publickey公钥,改成password则要输密码
# IdentityFile:私钥全路径名
# User:登录名
# 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、取消全局 用户名/邮箱设置,每个仓库单独设置

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

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

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

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

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

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