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

如何真正删除git分支(即删除其所有对象/提交)?,git,branch,git-gc,Git,Branch,Git Gc,我有一棵像吉特树一样的树 A---B---C topic / D---E---F---G master <-- A--B--C主题 / D---E---F---G master注意2010年5月:因为,如果您的分支被合并,主题仍然可以访问 这里,假设没有合并。 然后,如本节所述: 应该足够了(您应该直接调用gitprune)。您可以使用git count objects-v 编辑2012年4月

我有一棵像吉特树一样的树

                 A---B---C topic
                /
           D---E---F---G master     <--
A--B--C主题
/
D---E---F---G master注意2010年5月:因为,如果您的分支被合并,主题仍然可以访问

这里,假设没有合并。
然后,如本节所述:

应该足够了(您应该直接调用
gitprune
)。您可以使用git count objects-v

编辑2012年4月:在评论中确认可能需要额外的步骤,如中所述(但没有
git重新打包
)。
因此,与其使用
git-gc,不如现在就删掉

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

仅仅gc删减通常不足以去除repo中的额外对象。如果在ReFoLG中仍然引用了引用,它不会认为这些对象不可达,因此修剪已经成熟。 以下是对我有效的方法:

git reflog expire --expire=now --all
git gc --aggressive --prune=now
git repack -a -d -l
这将对你的回购历史做出一些改变,如果其他人依赖你吹掉的分支机构,这很可能会带来困难


您可能需要重新克隆存储库,才能真正看到其大小的差异。

实际上,“不可访问”比您在这里暗示的还要强大。就
git gc
而言,如果可以从reflog访问对象,那么它是可以访问的,而reflog需要很长时间才能过期。例如,您可以将分支合并到master,意识到它是坏的,并将master重置回以前的位置,并且在reflog条目过期(默认为90天)之前,提交将被认为是可访问的。此外,可能不用说,但是使用
--prune=now
时要格外小心。在按下enter键之后,如果意识到其他一些重要的提交被删除了,那就太可怕了。
git gc--prune=now
还不够-请看Duke的答案。@maxschlepzig true。正如杜克回答的第一条评论所表明的那样,我已经看到了他的答案(并投了赞成票)。我已经编辑了我的答案,以包括你的结论。我已经批准了你在杜克邮报上的编辑。赛尔夫注意:别忘了远程分支:VonC的回答解释了事情的真相。如果你想知道“哲学”的原因,很简单,git非常努力地不让你意外删除任何东西
git gc
本身就是一个清理/重新打包操作。你必须说一些更有力的话才能让它删除最近的作品。我必须使用
git reflog expire--expire=now--all
。注意添加的“expire”。叹气什么时候我们可以有一个功能强大的版本控制系统,通常的任务不需要博士学位就能完成?@DiegoSevilla查找旧对象并删除它们不是一个常见的操作。git的一个优势是,如果不真的尝试,就不能删除东西。伙计,我支持@DiegoSevilla。我是一个基本的git用户,我只是想创建一个可能的一次性分支来尝试一些疯狂的东西。我99%确定我不想保留它,并且我想在完成后删除它。这不是一个常见的工作流程吗?但是git说“如果你分支它,你就保留它!”(除非你喜欢跳圈。)没错。@MatthewCornell,大多数时候,你不应该关心运行
git gc
。想尝试新功能吗?太好了,做一根树枝,然后离开。那个功能不起作用?太好了,删除分支。但是一周过去了,你会想,“嗯,也许我试过的东西有意义。”因为git对象仍然存在,你可以复活你的分支。但是如果超过默认期限(90天),git将自动运行gc,并且您的测试分支中的对象将被删除。创建和删除分支很容易。失去工作很难。
git reflog expire --expire=now --all
git gc --aggressive --prune=now
git reflog expire --expire=now --all
git gc --aggressive --prune=now
git repack -a -d -l