git push error: dst refspec refs/heads/main matches more than one

git push error: dst refspec refs/heads/main matches more than one

目前,我所做的每项更改都被迫推送到一个新分支。并且必须删除该分支,因为错误会再次出现在每个新创建的分支上。

git push origin main 给出以下输出

error: dst refspec refs/heads/main matches more than one
error: failed to push some refs to 'https://github.com/CarloCattano/fastesTube'

我的 git tag 输出:

refs/heads/dev
refs/heads/dev2
refs/heads/dev3
refs/heads/main
v1.1
win64 

不管我用-d手动删除它们。 甚至尝试将项目迁移到新的 repo ,但在几次推送后问题仍然存在。

git remote -v

origin  https://github.com/CarloCattano/fastesTube (fetch)
origin  https://github.com/CarloCattano/fastesTube (push)

git ls-remote

ac4cac50b79ff682ddd01f6c0c3913d0bd765e64        HEAD
77273d612953f96e72ce305ab94f0a535a4c332d        refs/heads/dev3
3c344e7af2feb33db2d05f08866cad5fe624b57c        refs/heads/develop
ac4cac50b79ff682ddd01f6c0c3913d0bd765e64        refs/heads/main
fde3bb1ed7c770a5b8eb94a368bb34f25566f00e        refs/pull/1/head
ffe33059c3fcc12899953bc588772072d9a18bf0        refs/pull/2/head
77273d612953f96e72ce305ab94f0a535a4c332d        refs/pull/3/head
3c344e7af2feb33db2d05f08866cad5fe624b57c        refs/pull/4/head
b9d1c3f8b83ea1ac868143ec647776d03f9bacc7        refs/tags/refs/heads/dev
ffe33059c3fcc12899953bc588772072d9a18bf0        refs/tags/refs/heads/dev2
77273d612953f96e72ce305ab94f0a535a4c332d        refs/tags/refs/heads/dev3
4098ea71b5a0873db6be41e859e5b8242d81c708        refs/tags/refs/heads/main
a42341ba40635bd5063a0bf988eab6c00b0e62d1        refs/tags/v1.1
37220afec1d13dcac99c61ef766ac800fc6438f5        refs/tags/win64

强制推送似乎也不起作用。

可能是我错误地配置了 .yml 文件并为每个版本创建了标签。

这里的问题是您创建了名为 refs/heads/...tags(填写三个点)。

A refreference, 在 Git 中,是一个通常以 refs/ 开头的字符串,并且继续有一个命名空间限定符:

  • refs/heads/*分支名称:匹配*的部分是分支名称;
  • refs/tags/*标签名称:匹配*的部分是标签名称;
  • refs/remotes/* 远程跟踪 名称;

等等。通常你可以给Git一个缩写的名字,比如mainv1.1,它可以判断这个名字是分支名还是通过查看现有名称的标签名称:

  • 通常有 refs/heads/mainrefs/heads/master,但没有 refs/tags/mainrefs/tags/master,因此 mainmaster 因此是 分支机构名称。
  • 可能有 refs/tags/v1.1,但如果有,通常没有 refs/heads/v1.1,因此 v1.1 因此是 标签名字.

当使用这种方案时,您提供一个模棱两可的名称,如 mainv1.1,Git 会自行判断它是分支名称还是标签名称,or 你提供了一个 完整的 名字,比如 refs/heads/main 并且 Git 立即知道它是一个 branch 名字。前面没有 refs/heads/refs/tags/ 限定符的短名称是 非限定名称 。全名是限定名.

git push命令比大多数其他Git命令更复杂(除了git fetch同样复杂)因为它必须处理两个 Git 个存储库,而不仅仅是一个。所以 ref 可以取 refspec 而不是 ref,这是一对用冒号分隔的 refs :.如果您使用完整的参考规范:

git push origin refs/heads/main:refs/tags/v1.2

则左右两部分各refs各不合格或合格。可以通过查看本地 Git 存储库的名称(对于那些本地的)或远程的名称(对于那些远程的)来解决不合格的名称。

但是,如果您使用 部分 refspec:

git push origin main

然后 Git 不确定您的意思是“在本地找到的主”还是“在远程找到的主”。所以 Git 将在这两个地方进行查找以做出最佳猜测。

然而,在这种情况下,目的地 Git——其引用显示在你的git ls-remote输出中的那个——有两个refs/heads/main refs/tags/refs/heads/main。因此,您的 Git 已在本地查找 main 并找到 refs/heads/main;它现在在另一个 Git 存储库的一组引用中查找,并且 无法将其转换为一个引用 因为 both refs/heads/main——完全限定的分支名称——and refs/tags/refs/heads/main——完全限定的tag名称——匹配可能不合格的 refs/heads/main。结果是您收到此错误消息。

我不知道 git push origin refs/heads/main:refs/heads/main 是否会出现此错误。不过,最好的解决方法是更正 destination 上的名称集,这样就不再有 refs/tags/refs/* 名称了。也就是这四个名字:

b9d1c3f8b83ea1ac868143ec647776d03f9bacc7        refs/tags/refs/heads/dev
ffe33059c3fcc12899953bc588772072d9a18bf0        refs/tags/refs/heads/dev2
77273d612953f96e72ce305ab94f0a535a4c332d        refs/tags/refs/heads/dev3
4098ea71b5a0873db6be41e859e5b8242d81c708        refs/tags/refs/heads/main

应进行调整(或完全删除),以便 Git 存储库中 GitHub 上的标签名称不会以 refs/ 开头。理想情况下,这些标签名称不应与任何分支名称匹配:标签名称通常应符合 v* 形式,或其他一些“明确的标签”模式,这样就不会有人意外地认为它们是分支名称,或者反之亦然。

修复该问题后,简单的 git push 命令将再次起作用。