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学习Git如何Clone带有Submodule的仓库?