在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"
答案 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设置没有帮助...
答案 5 :(得分:1)
我遇到了相同的错误消息,但它有不同的原因/解决方案:
我需要在子模块命令之前运行 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