为什么按名称删除远程分支会产生错误,而被ref删除却不会呢?

问题描述 投票:2回答:1

当我尝试删除不存在的远程Git分支按名称时,预期会收到错误:

$ git push origin --delete non/existent
error: unable to delete 'non/existent': remote ref does not exist
error: failed to push some refs to '[email protected]:<_replaced_>.git'
$ echo $?
1

但是,删除相同的分支通过引用(例如从.git/config中删除)不视为错误:

$ git push origin --delete refs/heads/non/existent
remote: warning: Deleting a non-existent ref.
To github.com:<_replaced_>.git
 - [deleted]         non/existent
$ echo $?
0

为什么?这些命令是否等效?

git branch git-push remote-branch
1个回答
2
投票

它们不相同。

A ref是完全限定的,即以refs/开头,因此是明确的,或者不是完全限定的,即以refs/以外的其他开头。

未完全合格的裁判必须转换为完全合格的裁判。排位赛取决于git push的目标。如果找不到完全合格的裁判,则向git push的来源报告无法对裁判进行资格鉴定。

一个完全合格的ref当然已经是完全合格的,所以接收Git只是说“好,那不存在”,因此要求删除的Git很高兴报告该ref不存在。因此,运行git push --delete的Git很高兴,并认为一切都很好。

有人可能会认为,Git进行git push会意识到“我无法为您推荐该裁判”是很合理的。[[可能表示“我没有任何适合的装备”依次表示“无论您指的是什么,它都不存在”,这可能会使运行git push --delete的Git感到高兴。但这不是实际发生的情况。


请注意,如果引用存在歧义,并且匹配两个或多个可能性,则将观察到以下内容:

server-repo$ git for-each-ref 11ae6ca18f6325c858f1e3ea2b7e6a045666336d commit refs/heads/ambig 222c4dd303570d096f0346c3cd1dff6ea2c84f83 commit refs/heads/branch e068bdfce2fd992dc396cb4969327ef5c4d39a43 commit refs/heads/fix-signal d41117433d7b4431a188c0eddec878646bf399c3 commit refs/heads/foobranch 11ae6ca18f6325c858f1e3ea2b7e6a045666336d commit refs/heads/master 11ae6ca18f6325c858f1e3ea2b7e6a045666336d commit refs/tags/ambig d41117433d7b4431a188c0eddec878646bf399c3 commit refs/tags/tag-foo

和:

client-repo$ git push --delete origin ambig error: dst refspec ambig matches more than one error: failed to push some refs to [server URL]

© www.soinside.com 2019 - 2024. All rights reserved.