如何在远程Git仓库中删除HEAD分支?

8

这是服务器上的远程Git代码库。

[aaa@web48 proj.git]$ git ls-remote .
dfca707432eb53678b37026b160a4bdc7f1ac6c3    HEAD
dfca707432eb53678b37026b160a4bdc7f1ac6c3    refs/heads/master
1e09c37443ee758644a712e3c1a8b08b18a1f50d    refs/heads/placeholder

我想删除HEAD/master分支。我该如何在服务器上或远程操作进行呢?我正在使用Tower客户端。

1
那可能就是我想知道的 - 如何取消默认分支并切换默认分支。 - Pablo
1
请提供有关服务器正在运行的信息。您是否使用GitHub作为远程服务?然后,您可以在存储库的设置中切换默认分支,然后使用“git push origin:master”删除主分支(此时从Tower删除也应该可以)。删除“HEAD”是不可能的,因为它只是指向最新提交的链接,就像@Cupcake所说的那样。 - Knut
1
@Cupcake 我很乐意尝试从服务器的命令行解决方案。 - Pablo
1
@Knut我没有使用GitHub作为远程。它是安装在我的Web主机上的Git作为远程服务器。最新提交的情况很奇怪,因为我肯定有一个测试仓库,一个测试分支,我已经提交了一些内容,但这不是默认分支,远程也没有HEAD。所以仓库可能具有或不具有该符号链接,对吧?子问题是符号链接是如何/何时生成的?第二个问题是如何切换到其他分支。假设一旦HEAD链接创建,就没有办法删除它。 - Pablo
那么,最终结果如何呢?我的答案解决了你的问题吗? - user456814
显示剩余3条评论
2个回答

17

如果当前默认分支是远程分支,那么您无法删除它

在远程裸仓库中,HEAD 符号引用代表该仓库的默认分支。那个仓库的非裸克隆将在克隆后自动检出该分支。

由于它是默认值,您不能像通常一样直接删除它,Git 不会让你这样做:

$ git push origin --delete master

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/master
To c:/Users/Keoki/Documents/GitHub/bare
 ! [remote rejected] master (deletion of the current branch prohibited)
error: failed to push some refs to 'c:/Users/Keoki/Documents/GitHub/bare'

上面的错误消息指出,你可以绕过安全检查从而删除远程当前的HEAD分支,但我将向你展示如何更改默认分支,这样你就仍然可以保留一个默认分支,但也可以像你想要的那样删除master分支。

通过命令行更改默认的HEAD分支

如果你有访问远程仓库的权限,你可以更改远程仓库的默认分支。如果你使用的是像GitHub或Bitbucket这样的托管提供商,他们应该允许你通过他们的网页界面来更改默认分支。
因此,如果你有访问权限,使用以下命令更改符号引用HEAD所指向的分支:
git symbolic-ref HEAD refs/heads/<newDefaultBranch>

在GitHub或Bitbucket上更改默认的HEAD分支

正如我在前面提到的,如果你使用像GitHub或Bitbucket这样的托管服务,你可以通过Web界面更新远程仓库中的默认HEAD分支。

GitHub

转到您的存储库的“设置”选项卡,您会看到默认分支设置就在顶部,

GitHub settings

Bitbucket

转到您的存储库的“设置”选项卡,您会看到默认分支设置就在中间附近,

Bitbucket settings

更新本地克隆的引用以指向远程的默认分支

一旦您已经更新了远程裸仓库中的默认分支,您需要更新本地克隆库认为远程的默认HEAD分支指向哪里。你可以使用下面的命令来完成:

git remote set-head <remote> --auto

# Or shorter
git remote set-head <remote> -a

您可以使用以下命令确认本地仓库已经正确更新:

$ git branch -r
  origin/HEAD -> origin/foo
  origin/foo
  origin/master

现在您可以删除远程的主分支

既然您已经将远程默认的 HEAD 分支更改为不是主分支,您就可以在远程上删除它了。

$ git push origin --delete master

To c:/Users/Keoki/Documents/GitHub/bare
 - [deleted]         master

# Older syntax
$ git push origin :master

更多参考资料和文档


这确实解决了问题,我能够从主分支切换到不同的分支。整个答案非常广泛和有用。我有一个最后的问题 - 我确实有一些仓库,其中HEAD分支未定义。在哪个时候会创建这个HEAD分支,如果它被定义了,如何取消定义HEAD?谢谢。 - Pablo
@Pablo,你最好还是问另一个问题;)。我现在无法给你一个合适的答案,我需要稍后进行一些研究,但我现在没有时间去做。 - user456814
@Pablo,就我所知,你可以再次使用git symbolic-ref来删除裸仓库中的HEAD引用,但是我不确定这是否是一个好主意,我不记得这样做是否会有任何负面影响。 - user456814

2
注意:虽然您确实无法删除默认的HEAD分支,但是在Git 2.11(2016年第4季度)之前,您可以删除HEAD本身!
符号引用 -d:不允许删除HEAD
请参见提交12cfa79(由Junio C Hamano( gitster )于2016年9月2日进行)。
(由Junio C Hamano - gitster --合并在提交d1de693中,日期为2016年9月12日) "git symbolic-ref -d HEAD"可以愉快地删除符号引用,但结果的仓库会变得无效。教授该命令禁止删除HEAD。如果从存储库中删除符号引用HEAD,Git将不再将存储库视为有效,甚至"git symbolic-ref HEAD refs/heads/master"也无法从该状态恢复 (尽管"git init"可以,但这是一个“损坏”的存储库的明确标志)。类似于afe5d3d ("symbolic ref: refuse non-ref targets in HEAD", 2009-01-29)的精神,禁止删除HEAD以避免破坏存储库。

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