【问题标题】:How to remove all no-change commits from git repository?如何从 git 存储库中删除所有无更改提交?
【发布时间】:2021-05-24 09:49:44
【问题描述】:

由于 Mercurial 的一些转换机制,我的 git 存储库有很多提交而没有任何更改?有没有办法从这个存储库中删除所有这些无更改提交?

可以创建另一个存储库(删除提交),保持主存储库不变。

【问题讨论】:

  • 如果你知道它们是哪些,如果不是太多,你可以把它们压扁。
  • 要保留合并提交,其中大部分也是空的?
  • @ElpieKay 没有。我想删除所有空提交。

标签: git git-commit


【解决方案1】:

假设分支是foo。试试

git checkout foo
git rebase --root --no-keep-empty

它将所有提交重新定位到根提交。如果分支有多个根提交,则它是第一个父级在看到合并提交时的那个。 --no-keep-empty 修剪空提交,包括合并提交和正常提交。对于那些非空的合并提交,它会引发冲突。解决冲突并继续git rebase

【讨论】:

  • “不要保留空提交”是默认设置,因此您不必在此处添加 - 并不是说​​它会伤害...
  • @torek 没有--no-keep-empty,它不会修剪由git commit --allow-empty -m foo 创建的合并提交。我正在为 windows v2.29.2 使用 git bash。
  • 您是否更改了默认设置以包含--rebase-merges?默认情况下,它(呃,“它”我的意思是“rebase”)完全放弃所有合并。最近的 Git 确实将默认的变基从旧的“am”(git am)后端切换到了“-m”后端。
  • @torek 空的合并提交默认会在没有--no-kee-empty 的情况下被修剪,但空的非合并提交不会。如何更改默认值以包含 --rebase-merges
  • 我不确定是否可以,但有一些新的配置选项。 (我的大多数系统上仍然有一个较旧的 Git;有时我只在 Mac 上的 Linux VM 中构建当前的 Git。)
【解决方案2】:

您希望 git filter-branch 将移植物设置为您想要的血统。将每次提交的正确祖先写入嫁接文件(在 .git/info/grafts 中)并说 git filter-branch --all 以使用新的祖先结构重写所有历史。

【讨论】:

  • 为什么不直接使用--prune-empty?添加--tag-name-filter cat 可能也是个好主意。
  • @torek 因为 OP 想要删除空合并,不管这意味着什么。 prune-empty 不会这样做,我想是因为想要的是特定于情况的。我忽略了其他可能想要的选项,我已经故意将这些东西留给读者,因为我厌倦了提问者无论如何都应该做的工作。
猜你喜欢
  • 2019-10-10
  • 2021-12-30
  • 2011-01-01
  • 2018-02-10
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 2015-11-05
相关资源
最近更新 更多