git clone 可以正常工作;git submodule 失败,提示“权限被拒绝”。

32
在从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.

在处理子模块获取时,我不会被要求输入私钥密码,这一点很奇怪。同时,当我直接使用git clone命令时,一切正常。我已经检查了.gitmodules文件的内容,它包含正确的数据(我认为可以通过错误消息确认)。
最引起注意的是,我没有被要求输入私钥密码。更奇怪的是,当我使用ssh访问时,它会像执行拉取或克隆操作时一样要求我输入密码。
我使用的是Windows的Git版本为“git version 2.16.2.windows.1”。
7个回答

37

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

将此网址更改为https版本,然后重试。


2
使用HTTPS与密码的效果符合我的预期,因为此服务器启用了此功能。如果没有启用此功能,是否有其他替代方案? - brunoais
我不使用Windows,所以无法尝试,但这看起来像是你想要的ssh。https://github.com/ericblade/ssh-agent-cmd - lukas-reineke
那是为了那些不想多次输入密码的人而设计的。无论如何,谢谢。 - brunoais
谢谢。为了更改为HTTPS等效,我按照此处的说明,将git@git.mydomain.com:username/repository.git更改为https://git.mydomain.com/username/repository.git - pacoverflow
不错!我肯定是在尝试更新.gitmodules文件。在我的情况下,我的路径中没有缺少“https”,但需要在路径中包含“mygitusername@”以验证自己以克隆子模块(最终:https://user@whatever/repo.git)。最后,在项目目录中运行git submodule update成功地克隆了我的子模块。 - Broper
我已经尝试过了,但没有成功。这是我在.git/config中修改“submodule”条目的方式:[submodule "SubModuleName"] url = https://yours_truly@git.companyname.com/in/project_submodulename.git然而,Git始终拒绝许可(使用“git@git.companyname.com”而不是“yours_truly”)。我是不是忘记或打错了什么? - Jean-David Lanz

8
您也可以更改您的ssh密钥为不需要密码短语的密钥。我曾经遇到过同样的问题,现在在使用无密码短语后,“git submodule update --init --recursive”命令可以正常工作。
似乎这是Windows git的一个错误,当它更新子模块时,它不会要求输入密码短语。(git版本为2.19.1.windows.1)

1
2.19.2版本也有同样的问题 - 你尝试过通过某种方式报告这个bug吗? - vitalyster

5
问题似乎是OpenSSH 3.8弹出的对话框在win32上不可访问?
如果切换到Git Bash(默认与git一起安装),则会弹出对话框,您可以输入私钥密码。
正如其他人指出的那样,另一种选择是使用putty并设置plink与ssh一起使用。我通常使用该方法,并且它可以与pageant无缝配合使用。棘手的部分是设置plink:https://makandracards.com/makandra/1303-how-to-use-git-on-windows-with-putty *更新:我尝试了putty/pageant,但无法使其工作。由jenkins git插件传递的选项与pageant不兼容。
找到对话框并不能帮助我的Jenkins设置... enter image description here

我不再使用Windows,所以无法确认你的答案。 - brunoais
是的,我放弃了并在Ubuntu上安装了Jenkins。项目第一次尝试就构建成功了。 :-/ - Dinsdale

4

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

对我来说,创建一个没有密码的新ssh密钥解决了问题。


3

lukas-reineke的回答正确地描述了问题并提供了一个解决方案,即使用ssh-agent来启用克隆配置为应通过ssh而不是https进行克隆的git子模块。

除了使用ssh-agent之外,您还可以使用putty的pageant。这样您就可以将存储在putty中的主机配置为已保存的会话,然后使用以下命令克隆子模块:

set GIT_SSH=plink & git submodule update

当然,你需要确保在你的%PATH%中可以找到plink.exe,并且已将私钥添加到正在运行的pageant实例中(应该有一个小系统托盘图标,您可以单击“Add Keys”)。由于ssh-agent在Windows本机cmd.exe中正确运行可能有些棘手,我发现这种替代方法非常有帮助。

1
当在Windows上使用Putty和默认命令行中的Git时,这似乎是正确的解决方案。转换为https是一个不好的解决方法... - Melvyn

2

我遇到了相同的错误信息,但原因和解决方法不同:

简述

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

详情

我的存储库使用自定义ssh文件,即我有一个个人密钥(.ssh/id_rsa)和一个公司特定的仅用于git的密钥(.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

0

如果git没有要求你输入ssh密码,将你的ssh密钥添加到ssh-agent中,默认情况下,它会为你进行配置。在终端中键入以下命令来完成此操作,我使用了Git Bash,可能其他终端也可以。

ssh-add ~/.ssh/id_rsa

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