根本原因在于go mod tidy底层调用git时未获取有效凭证,Go不参与认证;需确保git凭证有效、GOPRIVATE域名严格匹配、GONOSUMDB同步配置,并验证SSH或HTTPS凭据在终端中可复现成功。

git clone 能通但 go mod tidy 报 401 或 “repository not found”
根本不是 Go 本身的问题,而是 go mod tidy 底层调用 git 命令时,没拿到有效凭证。Go 只负责拼 URL、触发 git,不参与认证——所以 git clone https://git.example.com/repo 成功,不代表 go get 就能过。
- 检查当前 git 凭证是否还有效:运行
git ls-remote -q https://git.example.com/repo.git,如果也报 401,说明凭证已过期或权限不足 - HTTPS 场景下,优先用个人访问令牌(PAT)替代密码;GitLab/GitHub 都已禁用账户密码直连
- Linux/macOS 不要用
git config --global credential.helper store存明文密码,改用cache或libsecret(Ubuntu)/osxkeychain(macOS) - Windows 用户注意:凭据管理器里存的是
https://git.example.com,不是带路径的完整 URL;删错条目会导致所有子路径失效
GOPRIVATE 设了但还是走代理或校验失败
GOPRIVATE 是开关,不是万能钥匙。它只告诉 Go:“别把这域名发给 GOPROXY,也别查 sum.golang.org”,但不帮你填用户名密码、也不改 git 行为。
- 必须严格匹配模块路径中的域名:比如模块是
git.internal.company.com/group/lib,GOPRIVATE就得设成git.internal.company.com,不能只写internal.company.com - 若用了端口(如
git.example.com:8443),GOPRIVATE必须包含端口号,否则不生效 - 设置了
GOPRIVATE后,仍要同步配GONOSUMDB,否则 Go 会坚持去校验 checksum,而私有库没注册到公共 sum DB,必然失败 - 验证方式:运行
go list -m all 2>&1 | grep "verifying",没输出才表示跳过了校验
SSH 方式拉私有模块时提示 “Permission denied (publickey)”
Go 调用 git 时,完全复用本地 SSH 配置。出错不是 Go 的锅,而是 ssh -T git@git.example.com 本身就通不过。
- 确认
~/.ssh/config中对应 Host 的IdentityFile指向正确的私钥,且权限是600 - 确保 SSH agent 已加载密钥:
ssh-add -l要能看到对应 key;必要时执行ssh-add ~/.ssh/id_rsa - Git URL 必须用 SSH 格式:
git@git.example.com:group/repo.git,不能写成https://或省略.git后缀 - 某些 Git 服务器(如旧版 GitLab)要求在
~/.ssh/config中显式设置IdentitiesOnly yes,否则可能选错密钥
go mod download 卡住不动,或反复重试同一模块
这不是网络慢,很可能是某一级间接依赖指向了一个已删除、重命名或权限收紧的私有模块,而 Go 在静默重试——它不会告诉你卡在哪,只是一直 hang。
- 加
-v参数看真实行为:go mod download -v,输出里会显示每个模块从哪个 URL 拉取、状态码、重定向链 - 用
go list -m all列出完整依赖树,找到可疑的私有路径,再手动git ls-remote测试那个仓库是否可达 - 临时切 direct 排除代理干扰:
GOPROXY=direct go mod download -v,如果这时好了,说明是GOPRIVATE漏配或GONOPROXY没对齐 - 清理缓存有时能绕过错误状态:
go clean -modcache,但别在 CI 环境乱用,可能引发版本漂移
GOPRIVATE 和 GONOSUMDB 必须完全一致,一个字母都不能差;而 git 凭证和 SSH 配置,必须能在终端里用纯 git 命令复现成功,Go 才可能成功。**


















