go 默认不认局域网 git 服务器,必须设 goprivate、gonoproxy、gonosumdb 三者并精确匹配域名+端口,否则 go get 跳过 git 认证直接报错;git 层认证需单独配置,与 go 无关。

Go 默认不认局域网 Git 服务器,必须显式告诉它“这是私有的”,否则 go get 根本不会走认证流程,直接 404 或 unknown revision。
为什么 go get 拉不到局域网 Git 模块
根本不是权限或网络不通的问题,而是 Go 默认把所有模块当公开源处理——它压根不调用 git 命令去认证,而是直接走 proxy 或 checksum 验证。一旦模块路径不在公共索引里(比如 git.internal.company/project),go get 就会跳过 Git 协议层,直接报错。
-
unknown revision:Go 没尝试拉代码,只查了 proxy 和 checksum DB -
module not found:Go 认为这不是私有模块,没触发本地git clone -
401 Unauthorized:说明 Go 已走 Git 层,但git自身认证失败(和 Go 无关)
GOPRIVATE 必须精确匹配域名+端口
它不是模糊匹配,也不自动包含子域名。写错就等于没设。
- 局域网地址是
git.internal.company:8080,GOPRIVATE必须设成git.internal.company:8080,不能省略端口 - 设成
internal.company不生效,git.internal.company也不覆盖api.internal.company - 多个地址用逗号分隔,**不能有空格**:
export GOPRIVATE=git.internal.company:8080,repo.corp.local - 验证是否生效:
go env GOPRIVATE,再跑go list -m all看是否还有verifying报错
Git 层认证要独立配,和 Go 无关
GOPRIVATE 只是“放行开关”,真正的拉取由 git 命令执行。所以你得确保 git clone https://git.internal.company:8080/project 或 git clone git@git.internal.company:project 能通。
- HTTPS 方式:配
~/.netrc或git config --global credential.helper store,填 PAT(Personal Access Token) - SSH 方式:确保
ssh -T git@git.internal.company成功,且~/.ssh/config里 Host 配置正确(含Port、IdentityFile) - 如果用 SSH,Go 会调用系统
git,所以git能连,Go 就能连;git连不了,Go 一定报 401
别漏掉 GONOPROXY 和 GONOSUMDB
这两个不是可选的“锦上添花”,而是 GOPRIVATE 的配套项,缺一不可。
-
GONOPROXY:让 Go 别把你的私有模块转发给代理(比如https://proxy.golang.org),否则会 404 -
GONOSUMDB:禁止 Go 去校验 checksum(私有模块没有公开 checksum 记录),否则报checksum mismatch - 三者要一起设:
go env -w GOPRIVATE=git.internal.company:8080 GONOPROXY=git.internal.company:8080 GONOSUMDB=git.internal.company:8080
最容易被忽略的是端口和协议一致性:Git URL 里带端口,GOPRIVATE 就必须带;用 SSH 就别指望 HTTPS 凭证能生效;go list -m all 报错时,先看是不是 go env 里三个变量都对齐了,再查 git clone 是否真通——别在 Go 层反复调试认证问题。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











