git clone 有效; git子模块失败“权限被拒绝”

Posted

技术标签:

【中文标题】git clone 有效; git子模块失败“权限被拒绝”【英文标题】:git clone works; git submodule fails "Permission denied" 【发布时间】:2018-08-17 21:29:49 【问题描述】:

在 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 version 2.16.2.windows.1"

【问题讨论】:

【参考方案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

将此网址更改为等效的 https 并重试。

【讨论】:

使用 HTTPS 和密码可以按我的意愿工作,因为此服务器中启用了此类功能。未启用此类功能时,是否有替代方案? 我不使用 windows,所以我不能尝试,但这看起来像你想要的 ssh。 github.com/ericblade/ssh-agent-cmd 这适用于不想多次编写密码的人。无论如何,谢谢。 谢谢。为了更改为 HTTPS 等效项,我将 git@git.mydomain.com:username/repository.git 更改为 https://git.mydomain.com/username/repository.git,如 here 所述。 不错!我肯定在尝试更新.gitmodules 文件。就我而言,我的路径中没有缺少“https”,但确实需要在路径中包含“mygitusername@”以验证自己以克隆子模块(最后:https://user@whatever/repo.git)。最后,项目目录下的git submodule update 成功克隆了我的子模块。【参考方案2】:

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

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

【讨论】:

与 2.19.2 相同的问题 - 您是否尝试以某种方式报告错误?【参考方案3】:

来自 lukas-reineke 的回答正确地描述了问题和一个可能的解决方案,使用 ssh-agent 启用克隆配置为通过 ssh 而不是 https 克隆的 git 子模块。

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

set GIT_SSH=plink & git submodule update

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

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

【讨论】:

这似乎是在 Windows 上使用 putty 并在默认命令行上使用 git 时的正确解决方案。切换到 https 是一个糟糕的解决方法...【参考方案4】:

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

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

【讨论】:

【参考方案5】:

问题似乎是 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 addon 传递的选项与 pageant 不兼容。

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

【讨论】:

我不再使用 Windows,所以无法确认您的回答。 是的,我在 Ubuntu 上安装了 Jenkins。该项目建立在我的第一次尝试之上。 :-/【参考方案6】:

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

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

【讨论】:

以上是关于git clone 有效; git子模块失败“权限被拒绝”的主要内容,如果未能解决你的问题,请参考以下文章

在 ssh-agent 中同时加载两个 ssh-keys 时,克隆(更新)git 子模块失败

git clone

Git学习Git如何Clone带有Submodule的仓库?

Git学习Git如何Clone带有Submodule的仓库?

git clone失败后无法删除文件夹

git进阶