根本原因是goprivate仅控制go跳过代理和校验,不解决git层认证;必须确保git clone对应url能成功,否则go get必然失败。

为什么设置了 GOPRIVATE 还拉不下来
根本不是 Go 本身拒绝连接,而是 go get 把下载任务交给了系统 git 命令,但 git 没法认证——GOPRIVATE 只是告诉 Go “别走代理、别校验 checksum”,它不提供用户名密码或 SSH 密钥。
-
GOPRIVATE=gitlab.example.com/**生效后,Go 会直接调用git clone https://gitlab.example.com/team/lib(或git@gitlab.example.com:team/lib) - 如果手动运行这条
git clone命令失败(报401 Unauthorized、Host key verification failed或Permission denied (publickey)),那go get必然失败 - 验证方式:直接复制模块路径,拼成
git clone命令跑一遍,比如git clone https://gitlab.example.com/team/lib.git
GOPRIVATE 的写法必须严格匹配模块路径前缀
Go 不支持域名通配(如 *.example.com),只认路径前缀匹配。写错一个字符、多一个空格、少一个 *,整个配置就失效。
GitHub 仓库备份技能 - 将 OpenClaw 工作空间自动或手动备份至 GitHub 私有仓库。支持自动定时备份和手动交互式配置,引导完成 Token 配置、仓库创建、首次备份及定时任务设置。用途:(1) 首次设置 (2) 日常备份。
- 模块路径是
gitlab.example.com/team/lib→GOPRIVATE必须包含gitlab.example.com/**(推荐)或gitlab.example.com/*(仅匹配一级子路径) - 多个域名用英文逗号分隔,**绝对不能有空格**:
gitlab.example.com/**,gitee.com/my-team/** - 如果仓库地址带端口(如
gitlab.example.com:8443/team/lib),GOPRIVATE也必须写成gitlab.example.com:8443/** - 设置后运行
go env GOPRIVATE确认值已生效;再执行go list -m all,若仍报verifying ... checksum mismatch,说明没匹配上
HTTPS 和 SSH 两种认证方式怎么选
选哪种取决于你的私有 Git 服务支持什么、CI/CD 环境是否方便注入密钥,以及团队运维习惯。两者互不兼容,路径写法必须一致。
- 用 HTTPS:模块路径写成
https://gitlab.example.com/team/lib,然后配置git credential.helper store并首次输入 token(不要用密码,用 Personal Access Token) - 用 SSH:模块路径必须是
git@gitlab.example.com:team/lib格式,且ssh -T git@gitlab.example.com和git ls-remote git@gitlab.example.com:team/lib.git都得成功 - CI 场景下,SSH 更可控:把
SSH_PRIVATE_KEY注入环境变量,用ssh-add加载,并确保私钥文件权限是600 - 混用会失败:比如
go.mod里写的是 HTTPS 路径,但本地只配了 SSH agent,Git 不会自动切换协议
自签名证书或内网 CA 怎么绕过 TLS 错误
GOPRIVATE 不影响 TLS 校验,所以即使配置正确,仍可能报 x509 certificate signed by unknown authority。
- 开发环境临时方案:
go env -w GOINSECURE="gitlab.example.com"(仅限内网可信环境) - 生产环境正解:把内网 CA 证书加入系统信任链,或让
git显式使用它:git config --global http."https://gitlab.example.com/".sslCAInfo /path/to/ca.crt - 注意:Go 本身不读这个配置,但
go get调用的git会读,所以最终生效的是git的 SSL 设置 - Windows 上若用 Git for Windows,证书路径常为
C:\Program Files\Git\mingw64\ssl\cert.pem,可直接覆盖或引用
git 命令本身能不能连、有没有权限、证书对不对。每次失败,先抛开 Go,拿 git clone 复现,问题边界就清晰了。










