git 克隆作品; git 子模块失败 "Permission denied"

git clone works; git submodule fails "Permission denied"

在 gitlab 的私有存储库上,当我 运行 git clone git@git.privateserver.local:group/project-submodule.git 克隆成功完成时。
作为克隆过程的一部分,我被要求 我的私钥密码。

当我运行 submodule update --init "group/project-submodule"
它失败了:

Permission denied, please try again. Permission denied, please try again. Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). fatal: Could not read from remote repository.

在尝试处理子模块获取时,我没有被要求我的私钥密码。

(我不得不匿名)

fatal: clone of 'git@git.privateserver.local:group/project-submodule.git' into submodule path 'C:/Users/user/repos/project-module/project-submodule' failed

我检查了 .gitmodules 文件,它包含正确的数据(我认为可以通过错误消息确认)。

引起我注意的主要因素是没有要求我提供私钥密码。更奇怪的是,当我直接使用 git clone 时,它 运行 符合预期。

我也已经通过访问 ssh 进行了诊断,它要求我输入密码,就像我执行拉取或克隆时发生的那样

对windows使用git "git version 2.16.2.windows.1"

Git 尝试使用 ssh 而不是 https 克隆子模块。 如果您还没有配置您的 ssh 密钥,这将失败。
您可以设置 ssh-agent 来缓存 ssh 密钥的密码,并让 git 来使用它。或者改成https。
Git 关于子模块有点混乱。它们在目录中的 .gitmodules 文件中配置,但是将此处的 url 从 ssh 更改为 https 将无济于事。 Git 使用在 .git/config 中配置的 url。
打开这个文件,你会发现类似这样的东西。

[submodule "project-submodule"]
    url = git@example.com:project-submodule.git

将此 url 更改为等效的 https,然后重试。

lukas-reineke 的回答正确地描述了问题以及使用 ssh-agent 启用克隆 git 子模块的可能解决方案,这些子模块配置为应通过 ssh 而不是 https 进行克隆。

作为使用 ssh-agent 的替代方法,您可以使用 putty 的 pageant。这样你就可以将 git 存储库所在的主机配置为 putty 中保存的会话,然后使用以下命令克隆子模块:

set GIT_SSH=plink & git submodule update

当然你必须确保 plink.exe 确实可以在你的 %PATH% 中找到,并且你已经将私钥添加到 运行 pageant实例(应该有一个小系统托盘图标,您可以单击它 'Add Keys')。

由于 ssh-agent 从 windows 的原生 cmd.exe 中正确获取 运行 可能有点棘手,我发现这种替代方法非常有用。

您也可以将您的 ssh 密钥更改为不需要密码的密钥。我有同样的问题,现在 git submodule update --init --recursive 在不使用密码后工作正常。

这似乎是 Windows git 中的一个错误,当它更新子模块时,它不要求释义键。 (git 版本 2.19.1.windows.1)

我也遇到了同样的问题。下载子模块时,GIT 不要求输入 ssh 密钥密码,这就是问题所在。

创建新的 ssh 密钥没有密码对我有用。

问题似乎是 OpenSSH 3.8 抛出了一个无法从 win32 访问的对话框?

如果你切换到Git Bash(默认安装git),然后弹出对话框,你可以输入你的私钥密码。

正如其他人指出的那样,替代方法是使用 putty 并设置 plink 以与 ssh 一起使用。我通常使用该方法,并且它可以完美地用于选美。棘手的部分是设置 plink:https://makandracards.com/makandra/1303-how-to-use-git-on-windows-with-putty

*更新:我试过 putty/pageant 但无法正常工作。 jenkins git 插件传递的选项与 pageant 不兼容。

虽然找到对话框对我的 Jenkins 设置没有帮助...

我 运行 进入相同的错误消息,但它有一个不同的 reason/solution:

TLDR

我需要在子模块命令之前运行export GIT_SSH_COMMAND='ssh -i ~/.ssh/some_ssh_id'

详情

我的存储库使用自定义 ssh 文件,即我有一个个人密钥 (.ssh/id_rsa) 和一个公司特定的 git-only 密钥 (.ssh/company_git_id)。 Git 默认使用 id_rsa 密钥,它无法访问 git 存储库。

以下调整使 git 可以使用公司特定的 git 密钥:

# Sets the SSH key of the repository to `company_git_id`:
git config core.sshCommand 'ssh -i ~/.ssh/company_git_id'
git fetch # works!

# The config.sshCommand does not work for submodules. Use this instead:
export GIT_SSH_COMMAND='ssh -i ~/.ssh/company_git_id'
git submodule update --rebase --remote my_module_dir # works!

请注意,这会更改您 运行 后所有命令的 GIT_SSH_COMMAND。

要取消此环境更改,您可以 运行 子模块在子 shell 内请求,如下所示:

(export GIT_SSH_COMMAND='ssh -i ~/.ssh/company_git_id' && git submodule update --rebase --remote my_module_dir)

或 shells 如 Bash 和 zsh,不需要 subshell

GIT_SSH_COMMAND='ssh -i ~/.ssh/company_git_id' git submodule update --rebase --remote my_module_dir