25

我有一个像

                 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 应该删除所有无法访问的对象?

4

2 回答 2

29

仅仅 gc prune 通常不足以摆脱 repo 中的额外对象。如果提交仍然在 reflog 中被引用,它不会认为这些对象不可访问,因此适合修剪。

这对我有用:

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

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

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

于 2010-12-16T04:29:33.480 回答
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
于 2010-05-21T13:34:30.910 回答