go.mod 和 go.sum 都必须提交,不可忽略或当临时文件;go.sum 记录依赖哈希用于校验,缺失会导致 checksum mismatch 错误;$gopath/pkg/mod 是本地缓存,应加入 .gitignore。

go mod tidy 后为什么 git status 会显示 go.sum 变更?
因为 go mod tidy 不仅更新 go.mod,还会同步校验并写入新依赖的哈希值到 go.sum。哪怕只是新增一个 import,只要该包未在 go.sum 中记录过,它就会被追加——这不是“临时文件”,而是必须提交的校验快照。
哪些文件绝对不能忽略、也不能当“临时”处理?
go.mod 和 go.sum 都是构建可重现性的核心依据,不是中间产物。常见误操作包括:
- 把
go.sum加进.gitignore—— 这会导致 CI 构建时校验失败,报checksum mismatch - 只提交
go.mod却漏掉go.sum—— Go 工具链会拒绝构建,提示 “go: verifying github.com/xxx@v1.2.3: checksum mismatch” - 在 CI 中运行
go mod tidy后不检查是否产生新变更 —— 若有,说明本地开发遗漏了依赖同步
CI 流程里怎么提前拦截未提交的依赖变更?
加一行检查即可,避免构建中途失败:
go mod tidy -v && git status --porcelain go.mod go.sum | grep -q '.' && (echo "error: go.mod or go.sum changed after tidy" && exit 1) || true
这条命令做了三件事:
- 先执行
go mod tidy -v确保依赖图干净 - 用
git status --porcelain检查go.mod和go.sum是否有未暂存变更 - 一旦发现变更就报错退出,强制开发者先
git add再提交
为什么 go cache 目录($GOPATH/pkg/mod)不算“临时文件”但也不该提交?
模块缓存是本地构建加速用的,路径固定、内容庞大、与机器环境强绑定。它既不会影响构建结果(Go 工具链只读 go.mod/go.sum),也无法跨平台复用。所以:
-
$GOPATH/pkg/mod必须加入.gitignore - 但别把它和
go.sum混为一谈 —— 前者是缓存,后者是校验凭证 - 如果发现
go mod download总失败,优先怀疑缓存损坏,而不是删go.sum重来
go.sum 再跑 go mod tidy,看似“干净”,实则可能拉到已被上游删除 tag 的 commit —— 因为新生成的 go.sum 会基于当前可用版本重新计算哈希,而那个旧版本可能已不可得。











