为什么git不允许我删除远程分支?

17

我有一个本地存储库,想要将其镜像到远程的“websrv”。这曾经可以正常工作,但是在我删除了一个本地分支后,现在执行此操作时会出错:

git push --mirror websrv

我明白了

remote: error: By default, deleting the current branch is denied, because the next
remote: error: 'git clone' won't result in any file checked out, causing confusion.
remote: error: 
remote: error: You can set 'receive.denyDeleteCurrent' configuration variable to
remote: error: 'warn' or 'ignore' in the remote repository to allow deleting the
remote: error: current branch, with or without a warning message.
remote: error: 
remote: error: To squelch this message, you can set it to 'refuse'.
remote: error: refusing to delete the current branch: refs/heads/ecoli-moments
To git@141.89.117.199:~/baki_tracking.git
 ! [remote rejected] ecoli-moments (deletion of the current branch prohibited)

分支'ecoli-moments'指向与主分支相同的提交,本地和远程都是如此。

我该怎么做才能正确删除远程分支?

更新:

远程仓库是裸仓库,我在服务器上检查了目录(配置文件为bare=true)。


1
是的,但就我所看到的,它告诉我如何处理错误消息,而不是原因。 - Marius
1
我的猜测是你没有推送到一个“裸”的仓库,并且你不被允许删除当前在“webserv”上检出的分支。 - Nils Werner
@NilsWerner:错误提示是关于克隆而不是工作目录的。这不是非裸库在推送到已检出分支时给出的那个错误。但是当我查找选项的文档时,它确实提到了非裸库。我仍然会相信错误消息而不是文档,并认为该存储库可能是正确的裸库。 - Jan Hudec
Marius,您能否更新一下问题,告知webserv上的存储库是否为裸库? - Jan Hudec
2个回答

23
即使是一个裸仓库也有当前分支。当你克隆仓库时,默认情况下将检出该分支。Git 不想删除它并告诉你原因。
默认分支是特殊的 HEAD 引用。将其修改为指向预期始终存在的内容或修订版本。另请参见 How does origin/HEAD get set?
您需要使用服务器上的 git symbolic-ref(1) 手动更改 HEAD 指向。
或者,您可以将错误中提到的选项设置为 false(在服务器上运行 git config receive.denyDeleteCurrent false);如果仅是备份(--mirror 仅适用于备份),则默认分支并不重要。

git symbolic-ref 已经完成了,谢谢。虽然我仍然不知道我是如何改变 HEAD 引用的。也许是我在玩 gitg 时不小心弄的... - Marius
@Marius:可能是在您第一次填充存储库或其他情况下发生了这种情况。 - Jan Hudec
我该如何将这个设置在服务器上为false? - rubo77
@rubo77,这取决于服务器的管理方式。Git本身不提供对其的访问权限,但是一些管理工具(如gitolite)可以在服务器存储库中设置选项的接口。 - Jan Hudec

1

看起来这似乎是一个非裸仓库。如果是这种情况,任何针对非裸仓库检出的分支的推送操作都不会起作用,Git 不允许这样做。

所以你需要检出一个不同的分支,然后将其推送到仓库中。

根据 Jan 的评论,一种有用的方法是根本不检出任何分支,即进入称为“分离 HEAD”状态的状态,其中“HEAD”“ref”指向特定修订版,而不是某个分支。

这样做的好处是,如果将来在不同的分支上进行更多提交,每次抛出此错误时就不必检出不同的分支。

然而,如果你只是为了备份而这样做,一个更好的方法是从下一次开始使用bare repo


2
一种有用的方法是检查是否没有任何分支,即进入称为“分离 HEAD”的状态,其中 HEAD 引用指向特定修订版本而不是分支。Git 可能会在这种推送上自行切换到该状态,但据我所知,没有人关心这种用例足以实现它。 - Jan Hudec
我确实考虑过那个方案,但是使用裸仓库更有意义。我会将您的评论添加到答案中。 - Anshul Goyal
我同意裸仓库更好。但是如果由于某些原因需要工作树或者现在很难切换,分离头指针是一个选项。 - Jan Hudec
@JanHudec 裸仓库抛出了这个错误... 嗯,我想不到会发生这种情况。 - Anshul Goyal
请再次阅读错误信息。它说无法删除引用,因为 clone 不知道要检出什么。因此不需要检出它。 - Jan Hudec
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接