今天在windows下clone代码后,执行go mod tidy,然后就提示需要输入密码,输完还是报错了。

错误如下:

 fatal: Cannot prompt because user interactivity has been disabled.
        remote: HTTP Basic: Access denied
        fatal: Authentication failed for 'https://git.xxx.com/iot/kafka_wrapper.git/'
 ...
  fatal: Cannot prompt because user interactivity has been disabled.
        remote: HTTP Basic: Access denied
        remote: You must use a personal access token with 'read_repository' or 'write_repository' scope for Git over HTTP.
        remote: You can generate one at https://git.querycap.com/-/profile/personal_access_tokens
        fatal: Authentication failed for 'https://git.xxx.com/iot/kafka_wrapper.git/'

1.对比排错

之前完全配置好的mac环境下就完全正常,查了一下git的config,确实有不同

git config --global --list

通过公司的文档得知,github上的代码若使用https的仓库地址,会触发github的频率限制,当然博主是没有遇到过这种情况,另外,私有仓库也需要账户密码(难怪)。所以全局把https替换为ssh,走公私钥校验:

git config --global url."git@github.com:".insteadOf "https://github.com/"
git config --global url."git@git.xxx.com:".insteadOf "https://git.xxx.com/"

2.补充

而对于 golang.org上的代码,在这一阶段,会从 https://go.googlesource.com获取代码,不过,这些代码都在github上有镜像,也可以替换一下:

git config --global url."git@github.com:golang/".insteadOf "https://go.googlesource.com/"

3.扩展

通常我们会对go进行配置国内的镜像:

export GOPROXY=https://goproxy.cn,direct
export GOSUMDB=sum.golang.google.cn
export GOPRIVATE=git.xxx.com
go env -w GOPROXY=https://goproxy.cn,direct
go env -w  GOSUMDB=sum.golang.google.cn
go env -w  GOPRIVATE=git.xxx.com

3.1 GOPRIVATE

在完成配置后,go 命令会从公共镜像goproxy.cn 上下载依赖包,并且会对下载的软件包和代码库进行安全校验,当代码库是公开的时候,这些功能都没什么问题。但是如果仓库是私有的怎么办呢?环境变量 GOPRIVATE就是用来控制go命令:配置私有仓库地址,这样的话,就可以跳过proxy server 和校验检查,这个变量的值支持用逗号分隔,可以填写多个值。

3.2 GOSUMDB

为了保证开发者的依赖库不被人恶意劫持篡改,Go team 推出了 Go module checksum database。服务器地址为:sum.golang.org。当你在本地对依赖进行变动(更新/添加)操作时,Go 会自动去这个服务器进行数据校验,保证你下的这个代码库和世界上其他人下的代码库是一样的。如果有问题,会有个大大的安全提示。当然背后的这些操作都已经集成在 Go 里面了,开发者不需要进行额外的操作。go会尝试对每一次依赖包下载操作进行验证,从而保证下载的依赖包始终是一致的。这样就保证了每一次的编译都是可重复的,也能很好的发现异常的变更。和 go.mod 一样,Go 会维护一个名为 go.sum 的文件,它包含了对依赖包进行计算得到的校验值。如果 go.sum 中的校验匹配失败了,Go 在编译下载的时候会给出提示,不一样了。

如果代码仓库或者模块是私有的,那么它的校验值不应该出现在互联网的公有数据库里面,但是本地编译的时候默认所有的依赖下载都会去尝试做校验,这样不仅会校验失败,更会泄漏一些私有仓库的路径等信息,我们可以使用 GONOSUMDB 这个环境变量来设置不做校验的代码仓库。记住是GONOSUMDB,它就像GOPRIVATE一样,校验时,会跳过这些私有库。