我正在使用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
两个版本都没有达到预期的效果(删除空提交)。
相反,我最终得到的是一个存储库,其中(请参见下面的屏幕截图,左侧是修剪之前,右侧是修剪之后):
- 一些空的提交已被删除
- 保留大部分空提交
- 非空提交在单独的提交序列中重复
有什么建议吗?
最佳答案
从您看到的重复历史记录来看,您在 BFG 运行后尝试删除旧的、现已重写的提交历史记录的尝试似乎已失败。发生这种情况的原因有多种,但主要原因是 myrepo.git
不是 BFG 说明中概述的裸/镜像克隆存储库。
某些东西正在保留旧的、前 BFG 重写历史记录,现在显示为重复。该历史记录有可能甚至很可能存储在诸如 origin
之类的远程位置,这也可以解释为什么您的 filter-branch
没有删除您的所有空提交期待。
最后,您可能对 add the --prune-empty-commits
feature to BFG 的当前 pull 请求感兴趣- 它运行良好,并且与 BFG 的所有内容一样,比运行 filter-branch
快几个数量级。
关于git: --prune-empty 使用 bfg 重复提交后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37192065/