go拉取私有仓库需同时配置GOprivate跳过代理和git认证(ssh或https凭据),并确保go.mod中模块路径与Git URL一致,否则因代理转发或路径不匹配导致404或权限错误。

Go 项目要拉取私有仓库(比如 github/gitlab 私有 repo、自建 Git 服务器)的模块,默认会失败,因为 go get 不会自动携带认证凭据。核心解法是配置 Git 凭据助手或显式设置 git 的 url. 规则,并确保 Go 模块代理不意外跳过私有域名。
Git 配置私有仓库认证(SSH 或 HTTPS)
Go 本身不处理认证,完全依赖底层 git 命令。所以必须让 git clone 能静默成功:
- 推荐用 SSH:把私有仓库 URL 改成
git@github.com:org/private.git形式,并确保~/.ssh/id_rsa已添加到对应平台(GitHub/GitLab);运行git ls-remote git@github.com:org/private.git测试是否免密成功 - 若必须用 HTTPS(如企业 GitLab 启用了双因素),则需配置 Git 凭据存储:
git config --global credential.helper store,然后首次git clone https://gitlab.example.com/group/repo.git会提示输入账号密码,之后就缓存了 - 避免在
go.mod中硬写带密码的 HTTPS 地址(如https://user:Token@gitlab.example.com/repo),既不安全又易泄露
Go 环境绕过 GOproxy 对私有域名的代理
默认 GOPROXY=https://proxy.golang.org,direct 会让所有模块走代理,但私有域名(如 gitlab.example.com)不该被代理——否则 go get 会尝试去 proxy.golang.org 拉取,直接 404。
- 用
go env -w GOPRIVATE=gitlab.example.com,github.com/my-org显式声明哪些域名跳过代理;支持通配符,如*.example.com - 确认生效:
go env GOPRIVATE应输出你设的值;go get private.example.com/repo此时会直连 Git,不再经 proxy - 如果公司有内部 Go 代理(如 Athens),可设为
GOPROXY=https://athens.example.com,但依然要配GOPRIVATE让它知道哪些不转发
go.mod 中引用私有模块的路径必须与 Git URL 一致
go mod 会把 require private.example.com/repo v1.2.0 中的域名当作导入路径,也当作 Git 克隆地址的基础——两者必须能对上,否则 go get 找不到仓库。
立即学习“go语言免费学习笔记(深入)”;
- 错误示例:模块实际托管在
https://git.company.com/go/private-repo,但go.mod写require private.company.com/repo v1.0.0→go get会尝试克隆https://private.company.com/repo,404 - 正确做法:保持模块路径 = Git 服务可解析的地址前缀。例如 GitLab 项目 URL 是
https://git.company.com/group/repo,那就用require git.company.com/group/repo v1.0.0 - 必要时用
git config重写 URL:git config --global url."git@git.company.com:".insteadOf "https://git.company.com/",这样即使go.mod里写 HTTPS,Git 也会自动转成 SSH
最容易被忽略的是 GOPRIVATE 和 Git URL 一致性——前者漏配会导致请求发到公共代理,后者错配会让 Git 根本找不到仓库,而错误信息(如 repository not found)往往只提示“没权限”,实际是路径或代理问题。