从Git存储库中的历史记录中修剪空合并提交

Bja*_*sen 39 git git-filter-branch

我已经清理了我们的Git存储库,我们需要从历史中删除大部分内容.我这样做使用:

git filter-branch --prune-empty --tree-filter 'rm -rf some_stuff'
Run Code Online (Sandbox Code Playgroud)

--prune-empty除了提交多个父项(合并提交)之外,该标志将删除在该过程之后保留为空的提交.即使合并的分支完全没有包含任何内容,合并也不会向树添加任何内容.

我如何从历史中修剪这些空的合并提交?

rap*_*sse 38

优于rebase解决方案,因为它保留了原始历史记录的提交者信息,提交者日期和非空合并.

git filter-branch --prune-empty --parent-filter \
    'sed "s/-p //g" | xargs -r git show-branch --independent | sed "s/\</-p /g"'
Run Code Online (Sandbox Code Playgroud)

这受到内核邮件列表中与Lucas解决方案相同的线程的启发.然而,它不需要Ruby并且是单行的.它确实需要的GNU版本xargssed虽然.

  • 在OSX`sed's/-p // g"| xargs git show-branch --independent | sed"s/^/ - p/g"| tr"\n"""`似乎对我有用 (6认同)
  • 另一个macOS选项:`brew install gnu-sed findutils`,这样你就可以用gx和xargs替换sed和gxargs fpr GNU goodness. (2认同)

sso*_*low 11

我需要filter-branchssokolow/profile的副本上运行后将ssokolow/lap分开.

这做了一个不错的工作,作为一个自动"崩溃任何遗留的东西--prune-empty"命令:

git rebase --root HEAD
Run Code Online (Sandbox Code Playgroud)

(我需要--root它,所以它会用仍然有内容的最旧的提交替换现在空的初始提交.)

  • 有用,但在某些情况下有点矫枉过正。值得注意的是,这种方法扁平化*所有*合并,而不仅仅是空合并。 (2认同)
  • @Thilo:看看`git rebase`和`git am`(git rebase委托给)的文档,我认为使用`--committer-date-is-author-date`应该可行.我还没有尝试过自己,但我即将到来. (2认同)

ral*_*nja -2

我在这里发现了一个围绕过滤器分支的非常可爱的小包装脚本:

https://github.com/pflanze/chj-bin/blob/master/cj-git-filter-branch

这里的先决条件和背景:

http://lists.q42.co.uk/pipermail/git-announce/2011-September/000486.html