如何在没有冲突的情况下自动挤压git存储库历史,以缩小它?

如何在没有冲突的情况下自动挤压git存储库历史,以缩小它?,git,squash,Git,Squash,我有一个存储库,它已经变得太大,以至于无法使用。基本上,我的存储库超过2GB,克隆时间太长。我现在想缩小它,但仍然能够回到一些特定的旧版本。。。 收缩需要重写历史,所以我同意。拥有克隆的人必须在新回购克隆的新分支上重新设置/cherrypick/copyfiles的基础 我在这个存储库中有二进制文件,但我需要它们(将其视为软件运行所必需的资源)。所以我不能真正使用过滤器分支或删除一些大的二进制文件,因为在恢复到以前的提交时可能需要它们 我不关心以前的旧分支/已经合并的分支(例如:feature

我有一个存储库,它已经变得太大,以至于无法使用。基本上,我的存储库超过2GB,克隆时间太长。我现在想缩小它,但仍然能够回到一些特定的旧版本。。。 收缩需要重写历史,所以我同意。拥有克隆的人必须在新回购克隆的新分支上重新设置/cherrypick/copyfiles的基础

  • 我在这个存储库中有二进制文件,但我需要它们(将其视为软件运行所必需的资源)。所以我不能真正使用过滤器分支或删除一些大的二进制文件,因为在恢复到以前的提交时可能需要它们
  • 我不关心以前的旧分支/已经合并的分支(例如:features分支),但我关心一些特定的提交(例如过去版本分支的头部)
  • 由于我将修改(~many~)非常旧的提交,我现在不知道如何正确解决合并冲突(基本的rebase/cherrypick可能会发生这种情况),所以我正在寻找一种不会产生任何冲突,或者只产生可以自动解决的冲突的解决方案
  • 我想保留所有当前的分支,这样在克隆上进行工作的人可以在它们上重新设置/复制更改的基础
  • 我希望在我的新提交之间有相关的历史记录,以与旧回购协议的历史记录相匹配(就像提交被挤压一样)。当前分支的历史记录将从这些旧的压缩提交之一开始
我认为这是一堆不必要的旧存储库历史。到目前为止,我为我的案例提出了一个可能的流程(我错过了一些步骤,我仍然不确定这是否会达到我认为的效果):

  • 克隆现有回购协议的镜像
  • 从我要保留的旧提交创建孤立分支。这将创建无父压缩提交,其中包含所需的所有文件
  • 以某种方式将它们链接到重新创建旧回购历史=>如何?合并/重设基础/重置+提交孤立项
  • Cherrypick每个当前分支的提交列表(使用间隔),并将它们应用于压扁其第一个不同提交父级的最新提交=>如何自动找到要应用cherry Pick提交间隔的提交?这会不会没有冲突
  • 将标记移动到新树。删除上一棵树。git垃圾收集
这在没有任何冲突的情况下是否可行? 这在任何情况下都有效吗(git提交树可能非常复杂)? 有没有更好的安全、自动挤压历史的解决方案

在我看来,这种类型的维护任务对于一个长期运行的项目来说是会发生的,所以我假设其他大型项目已经使用了某种类型的解决方案。但是我想可能有一个git init(或另一个命令)的选项我不知道,可以从这个用例的旧repo创建一个新的repo

更新:我在这里找到了解决方案的开始:
但我想在我的历史记录中多次这样做,以一种完全自动的方式(即没有冲突).

您可以只克隆回购协议的一部分:

git clone --depth depth 
这称为浅层克隆


不久前,Git提供了处理大型回购的其他策略。

Git浅层克隆是一个答案,但对于浅层克隆,您无法推动

就壁球而言,壁球只有在未出版的历史上才是好的,这个链接可能有用

推送后完成的任何挤压都需要在不同的分支上提交,因为它不是FF推送。这种挤压不会对存储库大小产生影响

如果您准备好进行强制推送(历史重写);然后,您可以执行过滤器分支并减小大小


如果您的坏版本位于完全不同的分支上;您可以创建一个git捆绑包,并将其作为简化存储库。

好的,经过几天的尝试和错误,我发现以下是最佳解决方案:

1) 从要用作新根的提交中,执行签出--orphan以创建孤立分支,并提交此版本的更改文件

2) 对于要保留的每个提交C,
checkout
commit C,
reset
to previous new commit B',commit以使C“new commit,B”作为父级。(谢谢你的链接)

3) 现在需要将现有分支重新链接到保留的最后一次提交。 在旧的历史中找到那个承诺。从那里,列出所有将其(或其任何父级)作为直接父级的提交。然后,您可以使用新的
git replace--graft
将它们的旧父级替换为新的提交

这将是非常有用的想出一个万无一失的脚本,虽然。。。如果我做了,我会把它贴在这里


警告:步骤3)仅在使用git 2.X时有效。1.X git客户端将不会在提交图中看到更改。

您确定这会缩小历史记录吗?如果您有大的二进制文件,很可能这是占用空间的原因,而不是提交本身。您可以转储大型对象的blob大小,并查看它们占2GB的百分比,这将为您提供可以实现的改进范围。一旦提交被压缩,这些提交中引用的二进制文件将不再使用,并且可以进行垃圾收集。。。我想。感谢blob大小提示,检查它可能会很有用。我发现浅层克隆只有在您希望将大型存储库设置为“只读”时才有用。否则,您将需要其他一些方法来缩小实际回购。不仅是您的本地克隆。我的存储库是私有的,我可以告诉所有用户重新设置基础,这样就不会有问题了。但是我想删除随后压缩的提交,以便可以对未使用的二进制blob进行垃圾收集。使用附带链接中描述的方法挤压。转到另一个文件夹并从您的