Git - 使用filter-branch删除空提交记录

77

如何使用git filter-branch删除没有变更集的提交?

我使用以下命令重写了我的Git历史记录:

git filter-branch --tree-filter 'rm -r -f my_folder' -f HEAD

这个方法很有效,但现在我有很多空变更集的提交。我想删除这些提交,最好在msysgit中进行。

重新设置基础不是一个真正的选项,因为我有超过4000个提交,其中一半必须被删除。


4
对于未来的访问者,git rm -r --ignore-unmatch --cached my_folder--index-filter 结合使用比 --tree-filter 更快,因为它不必检出每个修订版本。它完全在索引上操作。 - vmrob
3
如果您已经完成了(--tree-filter...)的工作,现在只想摆脱那些空的提交,以下命令可以解决这个问题:git filter-branch --prune-empty(只使用filter-branch命令不带任何'filter'),参见https://dev59.com/hV4c5IYBdhLWcg3wHHCY。当Jefromi下面的回答(https://dev59.com/uG435IYBdhLWcg3wlRMf)生成错误报告“Found nothing to rewrite”时,此方法非常有用。 - Ger Hobbelt
2个回答

73

只需添加--prune-empty选项:

git filter-branch --tree-filter 'rm -rf my_folder' --prune-empty -f HEAD

(当然,如果你有其他引用,你可能希望使用-- --all而不仅仅是HEAD来重新编写所有内容。)

请注意,这与--commit-filter不兼容;在这种情况下,查尔斯·贝利(Charles Bailey)给出了您的答案


51

仅查看filter-branch的文档,您应该能够执行以下操作:

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

4
+1 对此非常有用。如果您已经转换了一个 SVN 存储库,这将非常有帮助,因为通常会生成许多空提交。 - Fabio
1
这个命令在我的情况下并没有删除所有的空提交,但不幸的是我不知道为什么。 还有其他想法吗? - SeB.Fr
2
@SeB.Fr:我不知道这是否符合您的情况,但可能是这个链接(https://github.com/git/git/commit/79bc4ef3686bc6795aa79a1d4aa6d3060a2cbd93)? - CB Bailey
1
更新:在Windows 10上它无法工作,但幸运的是,在Windows 10周年更新中有Ubuntu。在那里运行良好。 - Alexander Puchkov
1
@AlexanderPuchkov 这是因为你在Windows CMD提示符中尝试了它。我也遇到了同样的问题。如果你在Git bash shell中完成它,它就会起作用。 - bart
显示剩余3条评论

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