一、git远端代码库是http,但是go和git工具链都默认是https。
防不胜防随时随地的https,根本改不完,索性加层代理解决。
当然了,这就引入了另一个问题,如何自签名https证书,以及如何让linux信任该证书。
1、生成https证书
openssl req -new -x509 -newkey rsa:2048 -nodes -keyout ca.key -days 3650 -out ca.crt
2、让linux信任证书(centos7.6)
cp ca.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust extract
对于私有仓库有另外一种方式是通过环境变量解决:
使用 GOINSECURE 环境变量,但这个环境变量不会禁用数据库校验,因此应该同时配置 GOPRIVATE 环境变量,避免数据库校验。
export GOINSECURE="my.gitlab.url"
export GOPRIVATE="my.gitlab.url"
export GONOSUMDB="my.gitlab.url"
export GONOPROXY="my.gitlab.url"
export GOPROXY="https://goproxy.cn"
二、升级引入三方包的版本,然后报错: invalid version: resolves to version v0.0.0-xxxx (v1.2.3 is not a tag)
通过给golang工具链增加-x选项(go get -x)观察,实际是对之前下载的 gopath/pkg/mod/cache/vcs/xxxxxx 文件进行 git cat-file blob 读取时报错 fatal: Not a valid object name。
原因是手工修改了go.mod里的依赖版本,需要先执行 go mod tidy 以更新go.sum文件。
三、go mod tidy 报错:Your account has been blocked
原因是之前设置的git免密登录失效了,需要排查下当前是哪种免密登录方式和是否配置正确。
git有三种免密登录方式:
1、SSH Keys
通过ssh-keygen生成公钥和私钥,将私钥放入需要拉取代码的机器,位置:~/.ssh/id_rsa
公钥通过gitlab账号管理界面添加。
然后设置url重写,以便支持ssh登录:
git config --global url."git@gitlab.example.com:".insteadOf "https://gitlab.example.com/"
如果不再使用,可以删除:
git config --global --unset url."git@gitlab.example.com".insteadOf
2、Access Tokens
git config --global url."https://oauth2:${accessToken}@gitlab.example.com".insteadOf "https://gitlab.example.com"
3、url里携带用户名和密码
git config --global url."https://${user}:${password}@gitlab.example.com".insteadOf "https://gitlab.example.com"
通过 git config --list 查看git环境变量判断当前使用的哪种免密登录方式。
四、go mod tidy报错:git@my.gitlab.url: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
原因是设置了url替换,支持了ssh登录方式,但是没有对应的免密设置,可以删除url替换或者重设免密登录方式。
git config --global --unset url."git@gitlab.example.com".insteadOf
五、go mod tidy报错:'origin' does not appear to be a git repository
git ls-remote -q origin in /gopath/pkg/mod/cache/vcs/xxxxxxxx: exit status 128:
致命错误:'origin' does not appear to be a git repository
致命错误:无法读取远程仓库。
请确认您有正确的访问权限并且仓库存在。
原因是vcs目录是root读写权限,而当前执行命令的账号不是root。
需要注意切换账号后,git的全局配置是否还存在,或者直接把配置写入 /etc/gitconfig 里。
六、build的提示:fatal: could not read Username for git: terminal prompts disabled
原因是需要下载私有仓库的代码,但是没有设置免密登录,而且终端禁用了用户名密码提示。
需要打开git的终端提示功能:export GIT_TERMINAL_PROMPT=1
然后再次build,会有提示:
Username for 'http://gitlab.example.com':
Password for 'http://myname@gitlab.example.com':
七、在开发项目时,同时需要开发依赖包,这时候就不方便用正常的mod管理方式了
将依赖包临时替换为本地路径:
replace my.gitlab.url/myname/mypkg => ../path/to/local/repo
--end--