Go不读.netrc文件,其模块下载器完全不解析该文件;私有仓库认证失败需通过GOPRIVATE配合Git credential.helper或带认证的GOPROXY解决。

Go 拉私有模块报 401/403/Authentication failed,根本不是 Go 的问题,而是 Git 凭证没对上 —— 你得让 git clone 能通,go get 才能通。
为什么 .netrc 文件对 go mod 完全无效
很多人以为写个 ~/.netrc 就能让 go get 自动带 token,结果还是 401。因为 Go 的模块下载器(go mod download)压根不读 .netrc,它只调用系统 git 命令,而 git 是否读 .netrc 取决于你的 credential.helper 配置。默认情况下,Linux/macOS 的 Git 不启用任何 helper,.netrc 就是废文件。
-
git默认不读.netrc,除非你显式配置了git config --global credential.helper netrc - 即使配了
netrc,也要确保chmod 600 ~/.netrc,否则 Git 会忽略 - 更常见且稳定的做法是用
store或osxkeychain/libsecret,它们把凭证存本地或系统钥匙串,Git 调用时自动注入 - 验证是否生效:直接运行
git ls-remote https://git.example.com/org/repo.git,不输密码就返回 ref 列表才算成功
GOPRIVATE 必须精确匹配模块路径域名
GOPRIVATE 是开关,不是模糊过滤器。设成 example.com,不会覆盖 git.example.com;设成 git.example.com,但模块路径是 git.example.com:2222/repo,那也必须写成 git.example.com:2222,端口不能省。
- 多个域名用逗号分隔,**不能有空格**:
export GOPRIVATE=git.example.com,my.company.internal - 支持
*,但只用于前缀匹配:github.com/my-org/*匹配github.com/my-org/lib,不匹配github.com/my-org(无路径) - 设置后必须验证:
go env GOPRIVATE看输出,再跑go list -m all 2>/dev/null | head -5,如果还出现verifying ... checksum mismatch,说明没生效 - 未生效的典型表现:
go get仍走proxy.golang.org,然后报module not found或 404
HTTPS vs SSH:选一种并配到底
模块路径和 Git 协议必须对齐。如果你 go.mod 里写的是 module git.example.com/org/repo,那 Go 默认尝试 HTTPS;想用 SSH,就得把路径改成 module git@git.example.com:org/repo,并且确保 ~/.ssh/config 里有对应 Host 配置。
立即学习“go语言免费学习笔记(深入)”;
- HTTPS 方式:URL 中嵌 token(如
https://token:x-oauth-basic@git.example.com/org/repo)仅适用于 GitHub/GitLab 等平台,且 token 需含read_package_registry权限 - SSH 方式:要求
ssh -T git@git.example.com能通,且git clone git@git.example.com:org/repo.git无交互成功 - 别混用:比如
go.mod写 HTTPS 路径,却指望 SSH key 生效 —— Git 根本不会触发 SSH 流程 - CI/CD 场景推荐 SSH + deploy key,避免 token 泄露风险;本地开发用 HTTPS +
credential.helper store更简单
Token 过期或权限不足时的真实表现
报错看起来像网络问题,其实是认证细节没到位。Git 返回的 fatal: Authentication failed 或 Go 报的 401 Unauthorized,背后往往是同一原因:token 权限不够、已过期、或用户名填错。
- GitHub/GitLab 的 Personal Access Token 必须勾选
read_repository(GitLab)或repo(GitHub),read_api不够 - 用户名字段填什么?HTTPS 下 Git 要求非空,填
git或任意字符串都行,密码字段填 token —— 这是 API 兼容约定 - Windows 用户注意:凭据管理器里存的是
git:https://git.example.com,删旧条目后重新git clone才会弹窗输新 token - 调试技巧:临时加
GODEBUG=httptrace=1,看go get发出的 HTTP 请求头里有没有Authorization—— 没有就说明 Git 层根本没传凭证
最易被忽略的一点:模块路径(module 声明)必须和 Git 仓库的实际 HTTPS/SSH 地址结构完全一致,差一个字符、多一个 .git 后缀、少一个子路径,都会导致 go mod download 找不到对应仓库,继而触发错误认证流程或 404。


















