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

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

最佳答案

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

这是对我有用的:

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

这将对您的 repo 历史进行一些更改,如果其他人依赖于您删除的分支,则可能会造成困难。

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

关于git - 如何真正删除一个 git 分支(即删除它的所有对象/提交)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2882375/

相关文章:

Git:设置主相同开发

git - 什么时候单个文件对于 git 来说太大了?

git - 什么时候 git prune objects : why is "git gc" not removing commits?

git - 通用 git 重置为默认上游 HEAD

git - 如何在 DVCS 中跨分支移动错误修正?

svn - 使用 TortoiseSVN 进行分支和合并的最简单方法是什么?

mercurial - 为什么 Mercurial 有时允许与祖先 merge ?

git - 你应该多久使用一次 git-gc?

git - 停止 git gc --aggressive,这是一件坏事吗?

Git 选项卡完成停止在远程分支上工作