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

Ala*_*lan 23 git branch git-gc

我有一个像git树

                 A---B---C topic
                /
           D---E---F---G master     <--
Run Code Online (Sandbox Code Playgroud)

我想删除主题及其上的所有对象.

我记下了主题的SHA ID,然后输入:

git branch -D topic
git gc                                   #  <-- I also tried prune here...
git checkout -b temp <SHA1 ID of topic>
Run Code Online (Sandbox Code Playgroud)

在最后一个命令之后,我希望得到一个错误(类似于"不存在的对象ID ......"或类似的那样).但是没有错误,gitk显示与上面相同的树结构?

我错过了什么 - 我认为gc/prune应该删除所有无法访问的对象?

Duk*_*uke 24

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

这对我有用:

git reflog expire --expire=now --all
git gc --aggressive --prune=now
git repack -a -d -l
Run Code Online (Sandbox Code Playgroud)

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

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

  • @DiegoSevilla查找旧对象并删除它们并不常见.git的优势之一是没有真正尝试就无法删除. (6认同)
  • *叹气*我们什么时候可以拥有一个强大的版本控制系统,通常的任务不需要博士学位来完成它们? (5认同)
  • 伙计,我和@DiegoSevilla在一起.我是一个基本的git用户,我只是想创建一个可能的扔掉分支来尝试疯狂的东西.我99%肯定我不想保留它,我想在完成后将其删除.这不是一个常见的工作流程吗?但是git说:"如果你分支它,你就保留它!" (除非你喜欢箍跳.)Ick. (2认同)
  • @MatthewCornell,大多数时候,您不必在意运行git gc。是否想尝试一项新功能?太好了,建立一个分支,然后放弃。该功能无法正常工作吗?很好,删除分支。但是接下来的一个星期过去了,您会想:“嗯,也许我尝试过的那件事是有道理的。” 因为git对象仍然存在,所以您可以恢复分支。但是,如果超过了默认期限(90天),则git将自动运行gc,并且测试分支中的对象将被删除。创建和删除分支很容易。失去工作很难。 (2认同)

Von*_*onC 6

注意2010年5月:正如Jakub提到的,如果您的分支已合并,主题仍然可以访问.

在这里,我们假设没有合并.
然后,如ProGit书中所述并在此SO问题中详细说明:

git gc --prune=now
Run Code Online (Sandbox Code Playgroud)

应该够了(你应该直接打电话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
Run Code Online (Sandbox Code Playgroud)

  • 此外,它可能不言而喻,但使用`--prune = now`是非常小心的.在击中输入之后意识到其他一些重要的提交已经被抹去是很糟糕的. (3认同)