使用场景:
如我有多个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@xxx
bitbucket.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参数就行了