go mod vendor和go get都出现error: cannot lock ref ‘‘:‘‘ exists;cannot create报错解决方案

如题,我在执行go mod vendor的时候产生了如下报错:

error: cannot lock ref ‘refs/remotes/origin/a/b/c’: ‘refs/remotes/origin/a/b/c/d’ exists; cannot create ‘refs/remotes/origin/a/b/c’

以下称这个报错为错误A。先说下背景。a b c d都只是代称,实际上对应着项目的一些内容,在此忽略。

问题背景(出错步骤)

1 假设实际项目名叫originPro,其中go.mod引入了一个名叫remotePro的包
2 remotePro项目共同的开发分支名是a/b/c,我自己开发原本想命名a/b/c_d,但是考虑到a b c d这几个加起来名称太长,为了美观我直接命名为a/b/c/d,第一次push的时候就警告我已经存在a/b/c分支了,但警告后还是push成功了。
3 接着别人去pull a/b/c分支的时候,发现拉不下来,提示存在a/b/c和a/b/c/d两个分支
4 于是把a/b/c/d分支删掉了,此时别人可以正常拉取
5 但我发现我本地执行go mod vendor的时候会报错误A,但是辛亏此时我知道更新了哪些包,于是先执行git remote prune origin然后再执行go get对应的包,最后go mod vendor就没问题了
6 随着时间的推移,发现每次有包更新都要重复步骤5,但是由于项目时间紧没有去处理
7 直到今天,发现执行go get或者执行go mod vendor都会报错,提醒我可以执行git remote prune origin后再去执行。然后我执行了git remote prune origin后再去执行还是报同样的错误,又会提醒要我执行git remote prune origin,总之就是陷入死循环了。。。

解决方案

如果只有一个包导致以上错误,一个临时的解决方案就是执行git remote prune origin,执行完后对应的包挨个执行go get

但如果遇到以上步骤7的情况,会发现无论go get怎么执行都没用了,哪怕是go get一个公共的包都不行。

首先说根本原因,发生这种错误是因为go mod 中有多个引入包都出现了错误A,这种可以通过报错看出来。而这时一个一个的去改已经不行了,需要把所有产生了报错的包都注释掉,然后挨个go get,这样可以算作是临时的解决方案,起码可以解决这次的问题了。

但如果将来别人提交的代码和自己的对不上,岂不是又会出现这个问题?

其实按以下以下步骤确认下就可:
1 确认对应包的错误远程分支已删除
2 本地执行git update-ref -d refs/remotes/origin/a/b/c/d,注意分支名对应自己的哈,保证不会有什么缓存(其实我觉得这步有没有都没啥问题,但是以防万一嘛)
3 最重要的,删除pkg的缓存。至于怎么删除嘛,找到自己的pkg目录,找到mod目录,里头有个cache目录,直接删掉,就搞定

然后我再试,就没有问题啦~

你可能感兴趣的:(工作,golang)