目标:不同仓库采用不同的身份提交,例如公司的仓库用工号,个人的仓库用自己的身份。
光实现这个目标,我通过实践后发现,如果仓库对应不同平台,例如公司仓库在 bitbucket/gitlab,而个人仓库在 github,那么只要用 git config 配置两套 user 就可以实现了,用同一个 ssh key 添加到不同平台账号下即可,并不需要两套 ssh key。
配置多个 user
全局的 user 配置,
git config --global user.name "user_A"
git config --global user.email "user_A@email.com"
针对某个仓库的本地 user 配置,
git config --local user.name "user_B"
git config --local user.email "user_B@email.com"
配置多个 ssh key
前提是你用 ssh 方式进行 git 操作的话,如果公司仓库和个人仓库在同一个平台,这里假设平台账号就不同了,那么显然这时用同一个 ssh key 的话会冲突(github 上我试过是这样),此时就要考虑为各自的账号分配各自的 ssh key 了。
首先创建两个 ssh key
//生成 key,注意起名时要区分开,xxxxxx 是需要自己定义的,起什么都行
ssh-keygen -t rsa -C "xxxxxx"
//紧接着将 key 添加到 key agent 里
ssh-add ~/.ssh/inc_id_rsa
在 ssh-add 操作时遇到一个问题,
Could not open a connection to your authentication agent.
网上查了相应解决办法,亲测有效 Could not open a connection to your authentication agent. 解决方案 。另外,如果在添加 key 时还遇到 Cannot download keys without provider 的报错,看看是不是用了 -K 的命令,反正我是这样,去掉 -k 命名再添加就成功了。
接着添加公钥到 github 或者其他仓库平台里。完成后测试通信,拿 github 来说,
ssh -T git@github.com
//这里在 测试 bitbucket 的时候总是 timeout,但是又能 clone 下来,不知道为什么
由于我在 ~/.ssh 文件夹下只有 inc_id_rsa 和 inc_id_rsa.pub 两个文件,缺少了 known_hosts 文件所以会提示警告,警告的原因
The authenticity of host'github.com(13.xxx.xxx.222)' can't be established.
RSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure want to continue connecting(yes/no/[fingerprint])?
yes 之后再测试一次与 github 的通信,此时应该就会和你 say Hi 了,并且还能知道你的身份。
接着配置 config
此时两个身份认证在平台都是有效的,可以分别从平台各自的仓库用 ssh 方式 clone 试试。正常来说都能成功 clone 下来。但问题是,比如我用的 git bash,关闭当前对话框后,再次新开一个,同样去 clone 代码,这时就不行了。原因是 ssh-add 形式的添加是临时性的,会话结束就失效了,想要生效还得重新操作
这样一来我才知道 .ssh 文件夹下 config 文件的作用,简单来说就是代替了我们每次去 ssh-add。config 里重点就是配置指定什么仓库平台对应用什么样的秘钥认证,起初我也看不懂,经过不停的删除新建对比调试大概就知道是这么个作用。
//Host 其实可以随便起,可以理解为 HostName 值的别名
Host github.com
//HostName 需要指定平台的域名或者IP地址,总之能准确访问到平台的 url
HostName github.com
//后面理解为指定 ssh key 就行了
PreferredAuthentications publickey
IdentityFile ~/.ssh/github_id_rsa
起初对 Host 值不理解,配成了 github,然后又用 ssh -T git@github.com 去测试联通性,告知的结果就是没有权限。原因在于,1. config 文件里配置的是 github,并没有配置 github.com 的认证,2. git bash 会话框里我又没有通过 ssh-add 方式添加 github ssh key,所以就报错了。
经过测试,其实 Host 值对应的就是 git@ 后面的值,如果不改 Host 值,用命令 ssh -T git@github 去测试联通性,此时也是可以连接到 github.com 上去的。但如果 HostName 没有配置,那么 Host 就必须指定平台域名或 IP 了,否则人家怎么定位。这个值影响什么呢?在 clone 仓库的时候也有 git@ 而后面紧跟的标识符就要替换成 Host 值,所以建议还是保持和域名一样。
区分提交用户名
完成上面两步就已经为同平台各自账号(或者不同平台的账号)分配了各自的 ssh key 了,但为了提交代码时区分用户,所以还得做一下刚开始说的 git config 操作,为不同仓库配置不同 user。
参考文章
通过 ssh config 配置 Git 多账户 SSH 登录
ssh-key git多账户配置
工作、开源两不误:Git多账号管理
网友评论