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

时间:2010-05-21 13:19:59

标签: git branch git-gc

我有像

这样的git树
                 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 个答案:

答案 0 :(得分:24)

只是gc prune通常不足以摆脱回购中的额外对象。如果在reflog中仍然引用了提交,则不会认为这些对象无法访问,因此修剪成熟。

这对我有用:

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

这将对您的回购历史进行一些更改,如果其他人依赖于您吹走的分支,可能会遇到困难。

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

答案 1 :(得分:6)

注意2010年5月:作为mentioned by Jakub,如果您的分支已合并,主题仍然可以访问。

在这里,我们假设没有合并 然后,作为mentioned in the ProGit book并详细说明SO question

git gc --prune=now

应该足够(你应该直接调用git prune)。您可以使用git count-objects -v来控制它 编辑2012年4月:评论中的maxschlepzig确认可能需要执行额外步骤,详见Dukeanswer(但没有git repack)。 所以而不是git gc --prune now

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