23

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

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

权限被拒绝,请重试。权限被拒绝,请重试。权限被拒绝(公钥、gssapi-keyex、gssapi-with-mic、密码)。致命:无法从远程存储库中读取。

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

(我不得不匿名)

致命:将“git@git.privateserver.local:group/project-submodule.git”克隆到子模块路径“C:/Users/user/repos/project-module/project-submodule”失败

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

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

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

使用 git for windows “git 版本 2.16.2.windows.1”

4

6 回答 6

28

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

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

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

于 2018-03-09T10:34:39.783 回答
5

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

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

于 2018-10-13T00:08:08.063 回答
3

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

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

正如其他人指出的那样,替代方法是使用 putty 并设置 plink 以使用 ssh。我通常使用这种方法,它在选美比赛中完美无缺。棘手的部分是设置 plink:https ://makandracards.com/makandra/1303-how-to-use-git-on-windows-with-putty

*更新:我尝试了腻子/选美,但无法正常工作。jenkins git addon 传递的选项与选美不兼容。

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

在此处输入图像描述

于 2020-11-26T00:16:43.100 回答
3

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

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

set GIT_SSH=plink & git submodule update

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

由于ssh-agent从 Windows 的本机 cmd.exe 正确运行可能有点棘手,我发现这种替代方法非常有用。

于 2018-07-05T20:17:38.807 回答
3

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

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

于 2020-05-29T11:42:45.480 回答
2

我遇到了相同的错误消息,但它有不同的原因/解决方案:

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)

或者对于像 Bash 和 zsh 这样的 shell,不需要子 shell

GIT_SSH_COMMAND='ssh -i ~/.ssh/company_git_id' git submodule update --rebase --remote my_module_dir
于 2021-06-01T10:34:49.350 回答