Git-使用filter-branch删除具有空变更集的提交


75

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

我使用以下方式重写了我的git历史记录:

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

这个工作很好,但是现在我有很多带有空变更集的提交。我想删除那些提交。最好在msysgit中。

变基不是真正的选择,因为我有4000多个提交,其中一半必须删除。


4
对于未来的观众,--index-filtergit rm -r --ignore-unmatch --cached my_folder比快得多--tree-filter,因为它并没有检查出每个修订。它完全在索引上运行。
vmrob 2014年

3
如果您已经做过工作(--tree-filter ...),现在只是想摆脱挥之不去的空提交,那可以节省我的培根:(git filter-branch --prune-empty只是filter-branch命令没有任何“过滤器”)-如stackoverflow.com/questions/28313664所示/… -当下面的Jefromi的答案(stackoverflow.com/questions/5324799/…)产生错误报告时,这很有用Found nothing to rewrite
Ger Hobbelt '16

Answers:


71

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

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

(当然,如果您还有其他引用,则可能要用-- --all而不是重写所有内容HEAD。)

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


50

只需查看的文档filter-branch,您就可以做到这一点:

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

4
为此+1。如果您转换了一个svn信息库,这通常会生成很多空的提交,则非常有用
Fabio

在我的情况下,此命令不会删除所有空的提交,但是不幸的是,我不知道为什么。还有其他想法吗?
2014年

2
@ SeB.Fr:我不知道这是否是您的情况,但可能是这个
CB Bailey 2014年

它向我抛出此消息:致命:模糊参数'$ @':未知修订或路径不在工作树中。使用'-'将路径与修订版本分开,例如:'git <command> [<revision> ...]-[<file> ...]'
Alexander Puchkov

更新:它在Windows 10上不起作用,但是幸运的是Windows 10周年纪念版内部有ubuntu。在那里工作得很好
Alexander Puchkov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.