goprivate必须设置,否则go 1.13+默认走proxy.golang.org导致403或仓库未找到;它仅做严格前缀匹配(如git.example.com不匹配dev.git.example.com),且不解决git层认证问题。

GOPRIVATE 必须设,不设就拉不到私有模块 —— 它不是可选项,而是 Go 1.13+ 的硬性准入条件。
go get 报 403 或 “repository not found” 怎么办
这不是网络不通,也不是 Git 配错了,而是 Go 根本没把请求发到你的私有 Git 服务器。默认行为是:所有 go get 都先走 https://proxy.golang.org,而你的域名(比如 git.example.com)不在它的白名单里,结果直接返回 403。
- 验证方式:运行
go env GOPROXY,大概率看到的是https://proxy.golang.org,direct—— 这个direct只对GOPRIVATE中列出的域名生效 - 临时绕过测试:执行
go env -w GOPROXY=direct,再试go mod tidy;如果成功,说明问题纯属 GOPRIVATE 缺失 - 不要改
GOPROXY去加私有地址,代理服务无法直连你内网的 Git,只会让错误更隐蔽
GOPRIVATE 域名匹配规则很严格
它只做前缀匹配,不支持通配符自动展开子域,也不忽略端口或路径后缀。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
- 设成
GOPRIVATE=example.com→ 不匹配git.example.com,也不匹配example.com:8080 - 设成
GOPRIVATE=git.example.com→ 匹配git.example.com/myorg/lib,但不匹配dev.git.example.com/lib - 含端口必须写全:
git.example.com:2222和git.example.com被视为两个不同域名 - 多个域名用逗号分隔,不能有空格:
GOPRIVATE=git.example.com,github.mycompany.com - 想覆盖所有子域?用
*.example.com,但注意:它不匹配example.com本身(无子域)
设置了 GOPRIVATE 还报 401 或 “unknown revision”
GOPRIVATE 只解决“是否走代理”,不解决“能不能 clone 下来”。401 错误 100% 出在 Git 层,和 Go 无关。
- 手动验证等价命令:
git ls-remote -q https://git.example.com/team/project.git refs/heads/main,看是否卡认证 - HTTPS 推荐用 Personal Access Token(PAT):
git config --global url."https://<token>:x-oauth-basic@git.example.com/".insteadOf "https://git.example.com/"</token> - SSH 要确认:
ssh -T git@git.example.com能通,且 CI 环境中SSH_AUTH_SOCK已正确传递给go进程 - 本地
git clone能通 ≠go get能通:Go 调用的是独立的 Git 子进程,它读的是全局git config和系统凭证助手(如osxkeychain),不是你当前 shell 的环境变量
go.mod 中 module 路径必须与仓库地址一致
Go 不会自动推导或重写模块路径。路径不匹配会导致 unknown revision,哪怕 Git 凭据和 GOPRIVATE 全对。
- 如果仓库地址是
https://git.example.com/team/project,go.mod第一行必须是:module git.example.com/team/project - 不接受模糊写法:
module project、module ./project、module myproject都会失败 - SSH 地址(如
git@git.example.com:team/project.git)不影响module声明 —— 仍建议用 HTTPS 风格路径,兼容性更好 - 子目录项目(如
https://gitlab.com/group/subgroup/project)必须完整写出三层:module gitlab.com/group/subgroup/project,少一级都不行
最容易被忽略的一点:GOPRIVATE 设置后,go list -m all 仍报 verifying <module>: checksum mismatch</module>?说明 GONOSUMDB 没同步生效 —— 它默认继承 GOPRIVATE,但如果你手动设过 GONOSUMDB,它就不会自动更新,得显式重置。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










