如何在filter-branch --subdirectory-filter之后从我的repo中删除不需要的对象

jet*_*ero 8 git

我正在使用

git filter-branch --subdirectory-filter dir/name -- --all
Run Code Online (Sandbox Code Playgroud)

建立一个仅具有与该目录/名称相关的历史的回购.在我进行过滤之前,我将原始repo(非常大)复制到tmp目录中.在filter-branch之后,repo看起来就像我想要的那样,有一个例外:它似乎仍然包含原始repo中的所有对象,即使它们没有显示在"git log"中.

如何完全删除所有不需要的对象?

我尝试过这样的事情:

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

我很清楚,我不知道他们为什么还在那里或者删除它们意味着什么,但我肯定愿意.与我有关的一些可能相关的信息是我在我的源代码库上做了一个git repack -a,它似乎将该packfile复制到新的repo.好像我应该仍然能够做我想做的事情.

Pie*_*ter 11

filter-branch还保留.git/refs/original中的备份引用,你必须在gc'ing之前删除它们

  • 如果这很简单,我会有点生气.我真的只是rm .git/refs/original吗? (2认同)
  • `rm`只有在没有执行GC的情况下才有效,因为GC将`refs`移动到`packed-refs`.删除由git-filter-branch备份的原始引用的正确方法是`git for-each-ref --format ="%(refname)"refs/original/| xargs -n 1 git update-ref -d`,如[git-filter-branch documentation](http://git-scm.com/docs/git-filter-branch)中所述.@jettero (2认同)