Windows Powershell中无法克隆Git子模块的问题求助
问题描述
我有一个配置了子模块的项目,子模块使用相对路径,父项目通过SSH克隆,因此子模块也应通过SSH检出。执行命令:git submodule update --init --recursive --remote时,在Windows Powershell中出现Permission denied错误。
推测原因是SSH密钥设置了密码,但Powershell并未像执行git clone时那样提示输入密码。现有的临时方案都不尽如人意:
- 使用Windows Git Bash(会提示输密码,可正常运行)
- 不为SSH密钥设置密码
- 不使用SSH
想了解这是否是已知问题/限制,有无更好的解决办法?
解决方案与说明
这确实是Windows环境下Git与Powershell交互的已知兼容性问题:Powershell默认使用的OpenSSH for Windows客户端,在Git子模块更新的流程中不会主动弹出SSH密钥密码输入提示;而Git Bash依赖的MSYS2环境下的SSH客户端,做了专门的交互适配,所以能正常提示密码。
以下是几个更优的解决办法:
1. 启用SSH代理自动加载密钥
通过ssh-agent缓存密钥密码,后续Git命令无需重复输入:
- 打开Powershell,先启动SSH代理服务:
Start-Service ssh-agent - 添加你的SSH密钥到代理(替换为你的密钥路径):
输入一次密钥密码后,代理会缓存该密码,直到你重启电脑或手动关闭代理。ssh-add C:\Users\<你的用户名>\.ssh\<id_rsa或自定义密钥名> - (可选)设置SSH代理开机自动启动:通过Windows任务计划程序,创建一个开机触发的任务,执行
Start-Service ssh-agent命令,避免每次手动启动。
2. 让Git使用Git Bash的SSH客户端
直接配置Git调用Git Bash环境中的SSH客户端(该客户端支持密码弹窗提示):
- 执行全局Git配置命令(路径根据你的Git安装位置调整,默认路径如下):
配置完成后,在Powershell中执行Git子模块命令时,会自动弹出密码输入窗口,和Git Bash的体验一致。git config --global core.sshCommand "C:\Program Files\Git\usr\bin\ssh.exe"
3. 将SSH密钥密码存储到Windows凭据管理器
Windows的OpenSSH客户端支持将密钥密码保存到系统凭据管理器,实现自动登录:
- 在Powershell中执行
ssh-add添加密钥时,输入密码后会弹出提示:是否允许此应用将密码保存到凭据管理器?选择“是”即可。 - 后续再执行Git命令时,系统会自动从凭据管理器读取密码,无需手动输入。
内容的提问来源于stack exchange,提问作者Leon0402
相关产品推荐
相关产品推荐

