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


我有一个本地存储库,我想镜像到远程'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'指向与master,local和remote相同的提交。

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

更新:

远程存储库是裸的,我检查了服务器上的目录(配置文件有bare = true)。


8795
2018-01-21 10:24


起源

是的,但据我所知它告诉我如何处理错误信息而不是原因。 - Marius
我的猜测是你没有推动 bare 存储库,您不能删除当前签出的分支 webserv。 - Nils Werner
@NilsWerner:错误是关于克隆,而不是工作目录。当推入签出分支时,这不是一个非裸存储库给出的。但是当我查找该选项的文档时,它确实讨论了非裸存储库。我仍然比文档更信任错误消息,并认为回购可能是正确的。 - Jan Hudec
Marius,你是否会如此善良并更新存储库(在webserv上)是否裸露的问题? - Jan Hudec


答案:


即使是裸存储库也有当前分支。克隆存储库时,默认情况下将签出该选项。 Git不想删除它,并告诉你原因。

默认分支是特殊的 HEAD 参考。将其修改为指向预期始终存在的内容,或指向修订。也可以看看 origin / HEAD如何设置?

您必须更改HEAD指向手动使用的内容 git symbolic-ref(1) 在服务器上。

或者您可以将错误中提到的选项设置为false(git config receive.denyDeleteCurrent false 在服务器上);如果它只是一个备份(--mirror 大多数情况下仅适用于备份),默认分支并不重要。


13
2018-01-22 06:14



git symbolic-ref做到了,谢谢。虽然我仍然不知道我是如何设法改变HEAD参考的。也许我是用gitg玩的... - Marius
@Marius:当您第一次填充存储库或其他东西时,可能会发生这种情况。 - Jan Hudec
如何在服务器上将其设置为false? - rubo77
@rubo77,这取决于服务器的管理方式。 Git不提供对它的访问,但是一些管理工具(如gitolite)具有用于在服务器存储库中设置选项的接口。 - Jan Hudec


这似乎是一个非裸存储库。如果是这种情况,对非裸存储库中已检出分支的任何推送操作都将无效,git不允许这样做。

所以你基本上需要检查一个不同的分支,然后推送回购。

从Jan的评论来看,一个有用的方法是根本不检查分支,即进入称为的状态 detached HEAD 在哪里 HEAD  ref 指向特定修订而不是分支。

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

避免这种情况的更好方法是,如果你只是为了备份而这样做,那就是使用a 裸露的回购 下次再开始。


1
2018-01-21 10:33



一个有用的方法是检查 没有 分支根本就是那个被称为“独立HEAD”的州所在的地方 HEAD ref指向特定修订而不是分支。 Git可能会在这样的推动下切换到该状态,但据我所知,没有人关心这个用例足以实现它。 - Jan Hudec
我确实想到了这一点,但为了这个目的使用一个简单的回购更有意义。将您的评论添加到答案中。 - mu 無
我同意裸回购更好。但是如果由于某种原因需要工作树或者现在很难切换,那么分离头是一种选择。 - Jan Hudec
仔细阅读错误,存储库实际上可能是裸露的! - Jan Hudec
@JanHudec裸露的回购抛出那个错误..嗯,当发生这种情况时,我想不出一个案例。 - mu 無