在 Github 创建了多个仓库,并为每个仓库使用了独立的 deploy key,结果在进行 git push 操作时,提示没有权限。错误信息类似:
ERROR: Permission to quyun/php-backend.git denied to quyun/aliyun-api-tools
官方的帮助中有提到这个错误:
https://help.github.com/articles/error-permission-to-user-repo-denied-to-user-other-repo
不过对于许多应用场景,使用一个全局的 key 并不能满足要求。
简单分析下,我们可以发现 ssh 客户端是通过类似:
git@github.com:quyun/aliyun-api-tools.git
这样的 git 地址中的 user 和 host 来识别使用哪个本地私钥的。
很明显,如果 user 和 host 始终为 git 和 github.com,那么就只能使用一个私钥。
指定私钥的方式也很简单,编辑 ~/.ssh/config,添加类似如下配置即可:
Host php-backend.github.quyun.net
IdentityFile ~/.ssh/github-php-backend
User git
Host aliyun-api-tools.github.quyun.net
IdentityFile ~/.ssh/github-aliyun-api-tools
User git
配置格式很简单,不多做解释。
光是这样指定当然不够,你会发现我这里的 host 已经不是 github.com 了。
我为每个仓库使用了自己的 host,每个 host 的域名做 CNAME 解析到 github.com,这样 ssh 在连接时就可以区别不同的仓库了。
来测试下:
# ssh -T git@php-backend.github.quyun.net
Hi quyun/php-backend! You’ve successfully authenticated, but GitHub does not provide shell access.
# ssh -T git@aliyun-api-utils.github.quyun.net
Hi quyun/aliyun-api-tools! You’ve successfully authenticated, but GitHub does not provide shell access.
可以看到 ssh 已经能够根据不同 host 使用不同私钥了。
最后,将你的 git 仓库地址中的 host 改为新设置的 host 即可,如上面的:
git@github.com:quyun/aliyun-api-tools.git
改为:
git@aliyun-api-tools.github.quyun.net:quyun/aliyun-api-tools.git
在 windows 下也会出现这个问题,用同样的方式解决即可!