使用SSH访问私有Git子模块时遇到权限拒绝问题
解决Git子模块添加时SSH权限拒绝问题
问题原因
你给父仓库game配置的core.sshCommand是本地仓库级别的配置,但git submodule add本质是克隆一个全新的game-engine仓库到子模块目录,这个克隆过程不会继承父仓库的SSH配置,而是使用默认的SSH密钥查找规则,所以找不到你的私有密钥,导致权限拒绝。
解决方案
方法1:临时指定SSH密钥执行子模块添加
在执行git submodule add时,通过环境变量GIT_SSH_COMMAND指定密钥路径,让克隆子模块时使用正确的密钥:
- Linux/macOS 终端:
GIT_SSH_COMMAND="ssh -i <path-to-ssh-key>" git submodule add git@github.com:maltebp/game-engine.git - Windows PowerShell:
$env:GIT_SSH_COMMAND="ssh -i <path-to-ssh-key>"; git submodule add git@github.com:maltebp/game-engine.git - Windows CMD:
set GIT_SSH_COMMAND=ssh -i <path-to-ssh-key> && git submodule add git@github.com:maltebp/game-engine.git
添加完成后,进入子模块目录,给子模块配置本地SSH命令,确保后续操作正常:
cd game-engine git config --local core.sshCommand "ssh -i <path-to-ssh-key>"
方法2:通过SSH配置文件全局管理密钥(更省心)
创建或修改SSH配置文件,为GitHub仓库指定专属密钥,这样所有相关Git操作都会自动使用该密钥:
- 打开SSH配置文件:
- Linux/macOS:
~/.ssh/config - Windows:
C:\Users\<你的用户名>\.ssh\config(如果没有就新建一个)
- Linux/macOS:
- 添加以下配置:
Host github-game HostName github.com User git IdentityFile <path-to-ssh-key> - 使用配置的Host地址添加子模块:
git submodule add github-game:maltebp/game-engine.git
这种方法不需要每次操作都指定密钥,后续子模块的pull/push也会自动用配置的密钥。
对你疑问的解答
- 不需要手动传入密钥,但要确保克隆子模块时SSH能定位到你的私有密钥,上面的两种方法都可以实现。
- 子模块搭配私有仓库的场景并不少见,只是需要注意SSH配置的作用范围——仓库级配置不会自动传递给新克隆的子模块。
内容的提问来源于stack exchange,提问作者maltebp
相关产品推荐
相关产品推荐

