我有像
这样的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应该删除所有无法访问的对象?
答案 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确认可能需要执行额外步骤,详见Duke的answer(但没有git repack
)。
所以而不是git gc --prune now
:
git reflog expire --expire=now --all
git gc --aggressive --prune=now