git推送错误:dst refspec refs/heads/main 匹配多个

Car*_*ano 18 tags git continuous-integration branch github

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

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'
Run Code Online (Sandbox Code Playgroud)

我的git tag输出:

refs/heads/dev
refs/heads/dev2
refs/heads/dev3
refs/heads/main
v1.1
win64 
Run Code Online (Sandbox Code Playgroud)

无论我是否手动删除它们-d。甚至尝试将项目迁移到新的仓库,几次推送后问题仍然存在。

git remote -v

origin  https://github.com/CarloCattano/fastesTube (fetch)
origin  https://github.com/CarloCattano/fastesTube (push)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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

tor*_*rek 43

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

\n

Git 中的ref或引用是一个字符串,通常以名称空间限定符开头并继续具有名称空间限定符refs/

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

等等。通常,您可以给 Git 一个缩写名称,例如mainv1.1,它可以计算出通过查看现有名称来

\n
    \n
  • 通常有一个refs/heads/mainor refs/heads/master,但没有refs/tags/mainor refs/tags/master,所以mainormaster是一个分支名称。
  • \n
  • 可能有一个refs/tags/v1.1,但通常没有\'tarefs/heads/v1.1如果有的话,因此v1.1也是一个标签
  • \n
\n

使用这种方案时,您提供一个不明确的名称,例如mainor v1.1,Git 会自行判断它是否是分支或标记名称,或者您提供一个完整名称,例如refs/heads/main,Git 会立即知道它是分支名称。前面没有refs/heads/或限定符的短名称是非限定名称。全名是合格名称refs/tags/

\n

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

\n
git push origin refs/heads/main:refs/tags/v1.2\n
Run Code Online (Sandbox Code Playgroud)\n

那么左边和右边的部分分别是裁判,每个部分要么不合格,要么合格。可以通过查看本地 Git 存储库的名称(对于本地的)或远程的名称(对于远程的)来解析不合格的名称。

\n

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

\n
git push origin main\n
Run Code Online (Sandbox Code Playgroud)\n

那么 Git 不确定你的意思是“本地找到的 main”还是“远程找到的 main”。因此 Git 会在这两个地方进行查找以做出最佳猜测。

\n

然而,在这种情况下,目标Git\xe2\x80\x94(其引用显示在git ls-remote输出\xe2\x80\x94 中)同时refs/heads/main 具有 和 refs/tags/refs/heads/main。所以,你的 Git 已经在本地查找main并发现了refs/heads/main;现在,它会在另一个 Git 存储库中的一组引用中查找该内容,并且无法将其转换为一个引用 因为refs/heads/main\xe2\x80\x94a 完全限定分支名称\xe2\x80\x94 refs/tags/refs/heads/main\xe2\ x80\x94a 完全限定标记名称\xe2\x80\x94与潜在不限定的refs/heads/main. 结果是您收到此错误消息。

\n

git push origin refs/heads/main:refs/heads/main我不知道您是否会收到此错误。不过,最好的解决办法是更正目的地上的名称集,以便不再有refs/tags/refs/*名称。也就是这四个名字:

\n
git push origin refs/heads/main:refs/tags/v1.2\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

一旦你修复了这个问题,简单的git push命令将再次起作用。

\n