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 ref 或 reference, 在 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 会自行判断它是分支名称还是标签名称,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
命令将再次起作用。
目前,我所做的每项更改都被迫推送到一个新分支。并且必须删除该分支,因为错误会再次出现在每个新创建的分支上。
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 ref 或 reference, 在 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 会自行判断它是分支名称还是标签名称,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
命令将再次起作用。