如何在使用filter-branch --subdirectory-filter命令后,从我的代码库中删除不需要的对象?

8

我正在使用

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复制到了新的库中。然而,看起来我仍然可以按照自己的意愿进行操作。

1个回答

11

filter-branch还会在.git/refs/original中保留备份引用,您在垃圾回收之前也需要将其删除


3
如果这么简单,我会有点生气。我是不是只需要运行 rm .git/refs/original 命令就可以了? - jettero
好的,删除确实有效(即使有更好的方法),这完全回答了我的问题,谢谢。 - jettero
2
只有在 GC 未执行时,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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接