git: --prune-empty after using bfg duplicates commits

git: --prune-empty after using bfg duplicates commits

我正在使用 bfg 从 git 存储库(的克隆)中删除一些子目录:

java -jar bfg-1.12.12.jar --delete-folders {folder1,folder2,folder3} --no-blob-protection myrepo.git/
git reflog expire --expire=now --all && git gc --prune=now --aggressive

这工作正常,但在我使用 bfg 之后我有很多空提交(即提交有很好的日志消息但没有更改,因为它们只触及现在已删除的文件)。

下一步我尝试使用

git filter-branch --commit-filter 'git_commit_non_empty_tree "$@"' HEAD

git filter-branch --prune-empty --tag-name-filter cat -- --all

两个版本都没有达到预期的效果(删除空提交)。

相反,我最终得到的是一个存储库,其中(见下面的屏幕截图,左边是修剪之前,右边是修剪之后):

  1. 一些空提交已被删除
  2. 大多数空提交仍然存在
  3. 非空提交在单独的提交序列中重复

有什么建议吗?

从您看到的重复历史来看,您的 post-BFG-运行 尝试删除旧的、现在重写的提交历史似乎很可能失败了。发生这种情况的原因有很多,但主要原因是 myrepo.git 不是 BFG 说明中概述的 bare/mirror-clone 存储库。

有些东西保留了 BFG 之前的旧重写历史,现在显示为重复。此历史记录可能或什至可能存储在远程服务器中,例如 origin,这也可以解释为什么您的 filter-branch 没有删除您期望的所有空提交。

最后,您可能对 add the --prune-empty-commits feature to BFG 的当前拉取请求感兴趣 - 它运行良好,与 BFG 的所有内容一样,比 运行ning filter-branch 快几个数量级.