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

时间:2018-03-09 10:23:05

标签: git windows-10 gitlab git-submodules git-for-windows

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

我跑的时候 submodule update --init "group/project-submodule"
它失败了:

  

许可被拒绝,请再试一次。   许可被拒绝,请再试一次。   权限被拒绝(publickey,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进行了诊断,并且它询问了我的密码,就像我执行pull或clone时发生的那样

使用git for windows" git版本2.16.2.windows.1"

6 个答案:

答案 0 :(得分:4)

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

将此网址更改为https等效内容,然后重试。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

set GIT_SSH=plink & git submodule update

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

由于ssh-agent很难从Windows的本地cmd.exe中正确运行,因此我发现这种替代方法非常有用。

答案 3 :(得分:1)

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

Windows git中似乎有一个错误,即当它更新子模块时,它不要求输入释义密钥。 (git版本2.19.1.windows.1)

答案 4 :(得分:1)

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

如果切换到Git Bash(默认情况下已安装git),则会弹出对话框,您可以输入私钥密码。

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

* 更新:我尝试过腻子/选美,但无法使其正常工作。詹金斯git插件传递的选项与选美不兼容。

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

enter image description here

答案 5 :(得分:1)

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

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