将大量 git 提交压缩为一个?

  • 本文关键字:一个 git 提交 压缩 git
  • 更新时间 :
  • 英文 :


有没有办法将 Git 分支历史记录中的大量提交压缩为一个? 我知道你可以git rebase -i但问题是分支的历史记录可能有 10,000 次提交,交互式变基会给我一个列出所有提交的 huuuuge 文件。 我只想说"将所有从 x 到 y 的提交压缩为一"。 我想将分支历史记录中超过 6 个月的所有提交压缩为一个。

假设分支master

如果x是根提交,

git checkout --orphan tmp y
git commit
git rebase --onto tmp y master
git branch -D tmp

如果x不是根提交,

git checkout y
git reset x --soft
git commit
git rebase --onto HEAD y master

如果您的意思是只需要 6 个月的历史记录,那么您可能需要考虑使用浅层克隆。 请参阅git clone(https://git-scm.com/docs/git-clone( 的--shallow-since选项。

这会保留提交的身份,因此即使与共享源存储库一起使用,也不太可能造成中断。 它还为您提供了将更深层次的历史保存在源上或存档存储库中的选项。 同样,由于保留了提交标识,因此如果需要将来进行故障排除或其他操作,您可以轻松地将浅存储库上完成的任何新工作与深层历史记录进行嫁接。


另一种选择是进行历史记录重写,创建一个新提交来代替一系列旧提交。 如果存储库是共享的,这将"破坏"其他人的存储库。 您需要与他们协调,以确保他们以正确的方式"修复"他们的存储库,否则他们可能会撤消您的重写。 请参阅 git 变基文档 (https://git-scm.com/docs/git-rebase( 中的"从上游变基中恢复",因为无论您如何重写,这都是适用的情况。

只要您的历史记录是严格线性的,ElpieKay建议的程序就会起作用,但这可能很耗时。 如果有多个分支,或者您保留的历史记录部分包括合并,则这变得不那么简单。

更普遍适用的解决方案是将git filter-branch--parent-filter一起使用。 鉴于这样的历史

... x -- O -- O -- O -- y ...

并希望将其减少到

... xTHRUy ...

(其中xTHRUy是单个提交(您可以执行以下操作:

export NEW_PARENTS=$(git show --format='%P' --no-patch) x
export OLD_PARENTS=$(git show --format='%P' --no-patch) y

其中xy是解析为相应提交的表达式。 这可能是提交 ID,或者如果您碰巧知道正确提交的"路径",则可能是类似master~137的内容。 然后

git filter-branch --parent-filter "sed "s/$OLD_PARENTS/$NEW_PARENTS/"" -- --all

最新更新