git: --prune-empty 使用 bfg 重复提交后

fue*_*zig 2 git git-rewrite-history bfg-repo-cleaner

我正在使用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
Run Code Online (Sandbox Code Playgroud)

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

所以下一步我尝试使用

git filter-branch --commit-filter 'git_commit_non_empty_tree "$@"' HEAD
Run Code Online (Sandbox Code Playgroud)

或者

git filter-branch --prune-empty --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)

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

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

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

在此处输入图片说明

有什么建议吗?

jav*_*ett 5

从您看到的重复历史记录来看,您在 BFG 运行后尝试删除旧的、现在重写的提交历史记录似乎失败了。发生这种情况的原因有很多,但主要是如果myrepo.git不是 BFG 说明中概述的裸/镜像克隆存储库。

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

最后,您可能对当前将功能添加--prune-empty-commits到 BFG 的pull-request 感兴趣- 它运行良好,并且与 BFG 的所有内容一样,比 running 快几个数量级filter-branch