目前,我被迫在每次更改时推送到一个新的分支。并且必须删除该分支,因为错误会再次出现在每个新创建的分支上。
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
手动删除它们. 甚至尝试将项目迁移到新的存储库,几次推送后问题仍然存在。
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/...
的标签(填写三个点)。
在 Git 中,引用或引用是一个字符串,通常以refs/
开头,然后具有命名空间限定符:
refs/heads/*
是分支名称:与*
匹配的部分是分支名称;refs/tags/*
是标签名称:与*
匹配的部分是标签名称;refs/remotes/*
是远程跟踪名称;
等等。 通常,您可以为 Git 提供一个缩短的名称,例如main
或v1.1
,它可以通过查看现有名称来确定此名称是分支名称还是标签名称:
- 通常有一个
refs/heads/main
或refs/heads/master
,但没有refs/tags/main
或refs/tags/master
,所以main
或master
因此是一个分支名称。 - 可能有
refs/tags/v1.1
,但如果有,通常没有refs/heads/v1.1
,因此v1.1
是一个标签名称。
使用这种方案时,你提供一个不明确的名称,如main
或v1.1
,Git 会自行确定它是分支还是标签名称,或者你提供一个全名,如refs/heads/main
,Git 立即知道它是一个分支名称。 前面没有refs/heads/
或refs/tags/
限定符的短名称是不限定的名称。 全名是限定名称。
git push
命令比大多数其他 Git 命令更复杂(除了git fetch
同样复杂),因为它必须处理两个Git 存储库,而不仅仅是一个。 因此,git push
可以采用refspec而不是refspec,这是一对由冒号分隔的 ref:
。 如果您使用完整的参考规范:
git push origin refs/heads/main:refs/tags/v1.2
然后左边和右边的部分都是每个参考,每个都是不合格的或合格的。 可以通过查看本地 Git 存储库的名称(对于本地名称)或远程名称(对于远程名称)来解决非限定名称。
但是,如果您使用部分引用规范:
git push origin main
那么 Git 不确定你的意思是"本地找到的主要"还是"在远程找到的主要"。 因此,Git 会在这两个地方进行查找以做出最佳猜测。
但是,在这种情况下,目标Git(其引用显示在git ls-remote
输出中的 Git)同时具有refs/heads/main
和refs/tags/refs/heads/main
。 所以,你的 Git 在本地查找了main
并找到了refs/heads/main
;它现在在另一个 Git 存储库的 ref 集中查找它,并且不能将其转换为一个 ref,因为两个refs/heads/main
(一个完全限定的分支名称)和refs/tags/refs/heads/main
(一个完全限定的标签名称)都与可能不合格的refs/heads/main
匹配。 结果是您收到此错误消息。
你是否会得到这个错误git push origin refs/heads/main:refs/heads/main
,我不知道。 但是,最好的解决方法是更正目标上的名称集,以便不再有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
应该进行调整(或完全删除),以便 GitHub 上的 Git 存储库中没有以refs/
开头的标记名称。 理想情况下,这些标记名称也不应与任何分支名称匹配:标记名称通常应符合v*
形式或其他"显然是标记"模式,以便没有人会意外地认为它们是分支名称,反之亦然。
修复此问题后,简单的git push
命令将再次起作用。
正如正确解释的那样,存在标签冲突。我可以在 GitHub 网站上看到我的标签没有列出(没有远程推送)。有问题的标签实际上是一个分支名称,被 GitHub 误解为标签 桌面。
错误指示有问题的标记。它是使用git tag
命令列出的。
以下命令允许删除 GitBash 中的标签(如之前共享):
git tag --delete tagname
之后,再次可以推送到遥控器。
我还尝试下载最新的 Beta,因为据说"具有以这种方式命名的现有分支的存储库仍然可以将更新推送到这些分支。 但是,使用较新版本的GitHub Desktop并没有为我解决这个问题。
更新:不确定这对于多个推送的可靠性如何! 我似乎遇到了一些奇怪的事情。我在查看时我的分支名称存储在多个引用下git ls-remote
我通过执行以下操作来解决此问题:
git push origin -u --force <sha>:origin/feature/branch
我认为我真正需要的只是origin/
前缀,可能不需要origin -u
我的
git tag
输出:refs/heads/dev ...
好消息:自 2023 年 3 月以来,不再可能将此类"标签"名称推送到 GitHub:
阻止不明确的分支和标记名称(2023 年 3 月)
GitHub 阻止以
refs/
开头的分支和标记名称。在后台,所有 Git 引用都以前缀开头(分支为
refs/heads/
,标签为refs/tags/
).
但是,在典型使用中,用户很少看到这些前缀,因此它们由 GitHub、Git 客户端和其他工具静默处理。当使用类似的字符串作为分支或标签名称的可见部分的开头时,这会导致歧义:用户是否打算
refs/heads/feature
或refs/heads/refs/heads/feature
?
在几乎所有情况下,分支或标签名称前面的refs/
都是偶然的,以后会成为一个有问题的惊喜。此更改阻止了此类名称的新引入.
具有以这种方式命名的现有分支的存储库仍然可以将更新推送到这些分支。