如何真正删除一个git分支(即删除其所有对象/提交)?

26

我有一个类似于git tree的结构

                 A---B---C topic
                /
           D---E---F---G master     <--
我想要删除主题及其所有相关对象。
我会记录主题的SHA ID,然后输入:
git branch -D topic
git gc                                   #  <-- I also tried prune here...
git checkout -b temp <SHA1 ID of topic>

在最后一个命令之后,我期望会收到一个错误提示(类似于“不存在的对象ID”之类的)。但是并没有出现错误,而且gitk显示的树形结构与上面相同?

我错过了什么 - 我认为gc/prune应该删除所有无法访问的对象?


2
VonC的回答解释了事情的真相。如果你想知道“哲学”原因,那就是git非常非常努力地不让你意外删除任何东西。git gc本身旨在进行清理/重新打包操作。你必须说一些更强烈的话才能让它有可能删除最近的工作。 - Cascabel
2个回答

30

仅进行垃圾回收清理通常不足以摆脱存储库中的额外对象。如果提交仍然被引用于引用日志(reflog)中,则它不会将这些对象视为不可达,因此可以删除。

以下方法对我有效:

git reflog expire --expire=now --all
git gc --aggressive --prune=now
git repack -a -d -l

这将更改您的存储库历史记录,并且如果其他人依赖于您删除的分支,则可能会出现困难。

您可能需要重新克隆您的存储库才能真正看到其大小上的区别。


6
叹气*什么时候我们才能拥有一个功能强大的版本控制系统,使得通常的任务不需要博士学位才能完成呢? - Diego Sevilla
6
@DiegoSevilla 找到旧的对象并删除它们不是常见的操作。Git 的一个优点是不能轻易删除东西,除非你真的、真的想这么做。 - wadesworld
2
我完全同意@DiegoSevilla的观点。我是一个基本的git用户,我只想创建一个可能的一次性分支来尝试一些疯狂的东西。我99%确定我不想保留它,并且完成后想删除它。这不是常见的工作流程吗?但是git说:“如果你分支了它,你就要保留它!”(除非你喜欢跳过骑马)。太糟糕了。 - Matthew Cornell
1
git repack -a -d -l 真的必要吗?它是做什么用的? - akavel
3
大多数情况下,你不必担心运行 git gc。想要尝试新功能?很好,创建分支并随意提交。该功能没有成功?没关系,删除该分支即可。但是一周过去了,你可能会觉得:“嗯,也许我尝试的那个东西有意义。”由于 git 对象仍然存在,你可以恢复你的分支。但如果超过了默认期限(90 天),git 将自动运行 gc,从而删除测试分支中的对象。创建和删除分支很容易,但丢失工作却很困难。 - Chris
显示剩余3条评论

6
注意:2010年5月,根据Jakub的提醒,如果您的分支已合并,则主题仍然可达。
在这里,我们假设没有合并。
然后,正如ProGit书中所述并在这个SO问题中详细说明的那样:
git gc --prune=now

应该足够了(你应该直接调用git prune)。您可以使用git count-objects -v进行控制。
2012年4月编辑:maxschlepzig在评论中确认可能需要额外的步骤,如Duke答案中详细说明的那样(但不包括git repack)。
因此,不要使用git gc --prune now

git reflog expire --expire=now --all
git gc --aggressive --prune=now

1
“Unreachable”在这里的含义比你所暗示的要更强烈。就git-gc而言,如果一个对象可以从reflog到达,那么它就是可达的 - 而reflogs需要很长时间才能过期。例如,您可能已经将分支合并到主分支,意识到它是错误的,并将主分支重置回先前的位置,直到reflog条目过期(默认为90天),该提交将被视为可达。 - Cascabel
3
另外,这可能不用说,但在使用 --prune=now 时一定要非常小心。如果在按下回车后才意识到其他重要的提交也被删除了,那将是非常糟糕的事情。 - Cascabel
git gc --prune=now 不够用 - 请参考Duke的回答。 - maxschlepzig
自己注意:不要忘记远程分支:https://dev59.com/amgu5IYBdhLWcg3wing4 - VonC

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