我在Github上有一个私有仓库,其中包含3个子模块,这3个子模块也都是私有的。
我在我的EC2服务器上生成了4个SSH密钥,并将它们应用为Github部署密钥到所有4个私有仓库。
我能够克隆主仓库,因为它识别了SSH密钥。当我运行"git submodule update"时,它在私有仓库上失败并显示以下错误:
错误:找不到存储库。 致命错误:远程端意外挂断
如果我手动检查这些私有仓库,则可以工作,但在使用git submodule命令时却不行。有什么想法吗?这不是完全支持吗?
我在Github上有一个私有仓库,其中包含3个子模块,这3个子模块也都是私有的。
我在我的EC2服务器上生成了4个SSH密钥,并将它们应用为Github部署密钥到所有4个私有仓库。
我能够克隆主仓库,因为它识别了SSH密钥。当我运行"git submodule update"时,它在私有仓库上失败并显示以下错误:
错误:找不到存储库。 致命错误:远程端意外挂断
如果我手动检查这些私有仓库,则可以工作,但在使用git submodule命令时却不行。有什么想法吗?这不是完全支持吗?
GitHub的身份验证有点奇怪。他们不使用用户名;他们仅根据您提交的公钥推断出您是哪个用户。由于您生成了四个部署密钥,当您的服务器连接到GitHub时,使用哪个密钥是任意的 - GitHub将接受其中任何一个,然后拒绝访问未注册该密钥的存储库。
因此,最简单的解决方案是为所有存储库使用单个部署密钥。
如果您无法这样做,可以通过使用SSH主机别名来进行操作。在服务器的~/.ssh/config
中添加以下段落:
Host repo-foo
HostName ssh.github.com
Port 443
User git
IdentityFile /path/to/my-ssh-key-file-for-foo
IdentitiesOnly yes
Host repo-bar
HostName ssh.github.com
Port 443
User git
IdentityFile /path/to/my-ssh-key-file-for-bar
IdentitiesOnly yes
然后将您的子模块指向repo-bar:username/bar.git
和repo-foo:username/foo.git
,而不是使用git@github.com:...
形式。
这将使git和ssh有效地将每个存储库视为位于不同的服务器上,并传入明确的身份文件,以便不会混淆要使用哪个密钥。
~/.ssh/config
)。吊销应该是双向的 - 拒绝主机X访问存储库Y,或从主机X吊销密钥Z。从存储库Y中吊销密钥Z变得笨拙。而且bdonlan.livejournal.com已经六年没有更新了 :) - bdonlan