【问题标题】:Git - remove commits with empty changeset using filter-branchGit - 使用过滤器分支删除具有空变更集的提交
【发布时间】:2011-03-16 11:49:52
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 对于未来的访问者,--index-filtergit rm -r --ignore-unmatch --cached my_folder--tree-filter 快得多,因为它不必检查每个修订版。它完全在索引上运行。
  • 如果你已经完成了这项工作 (--tree-filter ...),现在只想摆脱挥之不去的空提交,这节省了我的培根:git filter-branch --prune-empty(只是 filter-branch 命令 没有任何“过滤器”)——在stackoverflow.com/questions/28313664/…中找到——当Jefromi的下面的回答(stackoverflow.com/questions/5324799/…)产生错误报告Found nothing to rewrite时,这很有用。

标签: git git-filter-branch


【解决方案1】:

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

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

(当然,如果你有其他 refs,你可能想用-- --all 重写所有内容,而不仅仅是HEAD。)

请注意,这与--commit-filter 不兼容;在这种情况下,Charles Bailey has your answer

【讨论】:

    【解决方案2】:

    只需查看filter-branch 的文档,您应该可以这样做:

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

    【讨论】:

    • 为此 +1。如果您已转换 svn 存储库,这将非常有用,这通常会生成大量空提交
    • 在我的情况下,此命令不会删除所有空提交,但不幸的是我不知道为什么。还有其他想法吗?
    • @SeB.Fr:我不知道这是否是你的情况,但可能是this
    • 它为我抛出了这条消息:致命:不明确的参数'$@'':未知的修订或路径不在工作树中。使用 '--' 将路径与修订分开,如下所示:'git [...] -- [...]'
    • 更新:它在 Windows 10 上不起作用,但幸运的是 Windows 10 周年更新中包含 ubuntu。在那里工作得很好
    猜你喜欢
    • 2022-10-15
    • 2011-04-15
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 2014-03-23
    • 2017-01-24
    • 2019-04-11
    • 2011-11-17
    相关资源
    最近更新 更多