git clone正常但go mod tidy访问GitHub私有仓库报错排查
已将SSH密钥配置到GitHub账号,对指定私有仓库执行git clone可正常完成,但执行go mod tidy访问同一仓库时出现报错,需排查解决。
报错信息
go mod tidy返回的报错(已隐去私有仓库路径)如下:
github.com/[private repository path]: cannot find module providing package github.com/[private repository path]: module github.com/[private repository path]: git ls-remote -q origin in /mnt/dependencies/gopath/pkg/mod/cache/vcs/a1f499df6a9855aecdc77bda31504008583a3268fdd403799aade71bb47df7d2: exit status 128: fatal: 'origin' does not appear to be a git repository fatal: Could not read from remote repository Please make sure you have the correct access rights and the repository exists.
可正常执行的命令
隐去私有仓库路径的正常git clone命令:
git clone git@github.com:[private repository path].git
现有.gitconfig配置
已隐去姓名、邮箱信息的配置内容:
[user] name = [my name] email = [my email] [url "github.com:"] insteadOf = https://github.com/ [core] excludesfile = /workdir/.gitignore
关联环境信息
- 所有命令均在Docker容器内以root用户身份执行
- 宿主机使用与Docker容器内
~/.ssh目录下相同的密钥执行go mod tidy时,会弹出登录提示,当前GitHub已不再支持密码登录,仅接受SSH密钥或个人访问令牌认证 - gitconfig中配置的邮箱与上传至GitHub的公钥绑定邮箱完全一致
关联疑问
既然git clone可以正常执行,是否可以排除GitHub端密钥上传错误、密钥未启用SSO权限的可能性?
核心问题定位
现有insteadOf配置规则不完整:Go拉取模块时默认走https://github.com/地址,当前配置仅把https://github.com/替换为github.com:,缺少SSH协议前缀,导致Git无法识别正确的远程仓库地址,触发origin不是git仓库的报错。
修复步骤
修改
.gitconfig的url替换规则,补全SSH前缀:[url "git@github.com:"] insteadOf = https://github.com/替换后所有Git操作触发的
https://github.com/请求都会自动转换为git@github.com:格式的SSH地址,和手动执行git clone用的地址格式完全一致。配置GOPRIVATE环境变量,告诉Go工具链该私有仓库不需要走公共代理、不需要经过公共校验和数据库验证:
go env -w GOPRIVATE=github.com/[你的私有仓库路径前缀]/*如果组织下所有私有仓库都需要走私有拉取,可以直接配置为
github.com/[你的组织名]/*。清理Go模块缓存中之前拉取失败的脏数据:
go clean -modcache重新执行
go mod tidy验证即可。
疑问解答
git clone能正常执行,可以完全排除GitHub端密钥上传错误、密钥未启用SSO权限的问题。如果密钥有问题,手动执行git clone时就会报权限错误,不可能拉取成功。宿主机执行弹出登录提示,本质是宿主机上Git的url替换规则未配置,走了HTTPS协议才会要求输入账号密码,和密钥本身无关。
额外注意事项
- Docker容器内执行时,确认root用户的
~/.ssh目录权限正确:私钥权限要设为600,.ssh目录权限设为700,权限不符合要求时SSH会拒绝读取密钥,也会触发拉取失败。 - 如果配置完仍有问题,可以手动进入报错信息里提到的vcs缓存目录,直接执行
git ls-remote -q origin查看具体报错,能快速定位是配置问题还是权限问题。
内容的提问来源于stack exchange,提问作者Predrag3141

