我正在使用
git filter-branch --subdirectory-filter dir/name -- --all
构建一个仓库,只包含与该目录/名称相关的历史记录。在进行过滤之前,我将原始仓库(非常大)克隆到临时目录中。经过筛选分支后,仓库看起来正是我想要的,只有一个例外:尽管它们不在“git log”中显示,但似乎仍然包含来自原始仓库的所有对象。
如何完全删除所有这些不需要的对象?
我尝试了一些方法:
git reflog expire --expire=now --all
git gc --aggressive --prune=now
对我来说很明显,我不知道为什么它们还在那里,也不知道删除它们意味着什么,但我确实想知道。可能与此相关的一些信息是,我之前曾在源代码库上执行了git repack -a操作,似乎将packfile复制到了新的库中。然而,看起来我仍然可以按照自己的意愿进行操作。
rm
才能正常工作,因为 GC 会将refs
移动到packed-refs
中。按照 git-filter-branch 文档 中的说明,删除由 git-filter-branch 支持的原始 refs 的正确方法是git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
。@jettero - user