Git子模块公钥权限错误

4
我在Bitbucket上有两个仓库 - 我设置了一个访问密钥,可以用来克隆每个项目。仓库A将仓库B作为子模块。
在Windows上...成功克隆仓库A后,git submodule update --init失败,原因如下:
Cloning into 'C:/Path/to/submodules/B'...
git@bitbucket.org: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and that the repository exists.
fatal: clone of 'git@bitbucket.org:org/B.git' into submodule path 'C:/path/to/submodules/B' failed
Failed to clone 'submodules/B'. Retry scheduled

.gitmodules的设置如下:
[submodule "submodules/B"]
    path = submodules/B
    url = git@bitbucket.org:org/B.git
...

如果我按照.gitmodules中指定的URL克隆该存储库,它可以正常工作:git clone git@bitbucket.org:org/B.git 似乎通过git submodule update --init尝试克隆的存储库无法看到/使用我添加的ssh访问密钥。 Git Submodule - Permission Denied的建议没有起作用。
也许密钥需要刷新吗?不,该密钥可以完美地下载所有其他存储库。
也许密钥本身存在问题,尝试ssh -vT git@github.com。将其更改为bitbucket.org后,它可以正常工作,并成功进行身份验证。
我在http上没有遇到这个问题-我也不喜欢ssh因为这个问题,但是,唉,它是必需的。
如何解决这个问题?或者我缺少哪些配置?
我将在开发docker容器环境中进行此操作,因此不能排除这一点。

这不像以下的问题:


考虑使用GIT_TRACE和/或您拥有的任何系统跟踪工具,以查看子模块克隆是否使用与手动git clone不同的ssh实现。我认为这是最有可能的罪魁祸首:您的计算机上有两个不同的ssh命令,其中一个在此处起作用,而另一个则没有。 - torek
谢谢建议 - 今天会尝试一下。我知道PowerShell有类似curl的别名,因此可能是两个不同的SSH实现导致了问题。 - hi im Bacon
3个回答

0

在克隆存储库时,您需要确保使用的是哪个密钥。

如果您的访问密钥不是默认密钥(例如 ~/.ssh/id_rsa),则子存储库的 URL 需要引用第二个密钥(即访问密钥)。

您可以更改子模块的远程 URL

git submodule set-url -- accessKey:me/mySubmoduleRepository

它将使用一个 ~/.ssh/config 文件:

Host accessKey
  hostname bitbucket.or
  User git
  IdentityFile ~/.ssh/myAccessKey

这样一来,git submodule update --init 将会直接使用 SSH URL 引用您的访问密钥:子模块应该被克隆。


是的,该密钥是我机器上的默认密钥,当我克隆A仓库时,我没有做任何特殊处理,它能够正确地从“〜/.ssh/id_rsa”中获取密钥。这是一个不错的建议,但这是否意味着我的同事需要以相同的方式配置他们的ssh?否则,他们将面临自己的权限问题,尝试查找未指定的密钥。 - hi im Bacon
如果直接使用 git clone git@bitbucket.org:org/B.git 命令可以正常工作,那么您就不需要 ~/.ssh/config 文件。不过,建议您再次检查 ~/.ssh/config 文件的内容,并且还要检查全局 Git 配置中的任何 "insteadOf" 指令:git config --global -l|grep -i inseadof - VonC

0

不幸的是,我是团队的一部分,改变系统以使用HTTPS可能不会得到赞赏。尽管我同意这将避免问题。 - hi im Bacon

0
我遇到了同样的问题,原因是MING终端不使用与Sourcetree UI相同的身份验证方法。
简单来说,在运行git submodule update --init之前,请在终端中输入以下内容。
git config credential.helper sourcetree

我在这里找到了答案: https://jira.atlassian.com/browse/SRCTREE-2029 注意: 您必须确保您的“父”存储库已设置为在Sourcetree中使用ssh。您可以通过点击Repository->Repository Settings并查看源路径来检查此设置。如果路径以“http://”开头,则需要进行更改,否则此答案将无法正常工作。 关于此问题的更多信息请参阅:如何在克隆远程存储库时将Sourcetree设置为默认使用ssh路径?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接