代码之家  ›  专栏  ›  技术社区  ›  BoffinBrain

如何删减回购历史的特定部分以消除膨胀

  •  0
  • BoffinBrain  · 技术社区  · 7 年前

    this GitHub help page . 使用过滤分支,我可以根据自己的喜好修改回购的历史记录。

    不幸的是,我犯了一个错误 pull

    Visual explanation

    现在,我可以再次运行过滤分支步骤,并强制推动以修复我所拥有的,但回购仍“膨胀”到其规模的两倍。

    我大致知道合并发生在哪里,但不知道具体的提交。我想能够识别和证明哪个提交是罪魁祸首,然后永久删除提交树A。我有一些关于如何做到这一点的潜在想法。。。

    • 修改连接A和B的特定提交,然后运行剪枝以垃圾收集其下的所有内容
    • 通过完全从历史记录中删除该提交,并在剪枝之后复制它

    我欢迎大家的建议!

    2 回复  |  直到 7 年前
        1
  •  1
  •   torek    7 年前

    修改连接A和B的特定提交

    你真的 不能 这样做。但是你可以做一些同样好或足够好的事情:你可以做一个 复制 但在提交副本之前,请使其仅引用B端父级,而不是A端父级和要删除的旧历史。

    一旦你复制了 那个

    当然,在复制了这些子对象之后,您现在必须复制 他们的 儿童新副本将指其他新副本。这会一直重复,直到达到最近的提交。

    git filter-branch 再一次这次的过滤器是: 当达到将A与B连接在一起的特定提交时,制作一个不这样做的副本。 所有其他提交均按“原样”复制。filter branch命令知道从第一次更改开始替换新的父级。当复制早期提交时(A侧和B侧中出现此错误之前的提交),“副本”将与原件逐位相同,因此过滤器分支将重新使用原件。

    最终结果将是 犹如 您已经更改了一个特定的提交,但它及其所有子体将 提交。然后,您可以将此存储库克隆到一个新的克隆,该克隆根本不涉及a端提交,它们将不会被复制;或者,正如您所建议的,您可以删除它们(但这非常困难,因为Git非常希望避免丢失工作,即提交)。在任何情况下,一旦做到了这一点,您必须说服存储库的所有用户放弃他们以前的克隆,转而使用这个新的重新缩小的存储库。

    现在剩下的问题是如何说服Git更改某个特定提交的父代。有两种简单的方法可以做到这一点:

    • 使用“父过滤器”:请参阅过滤器分支文档
    • 使用 git replace 首先构造替换提交,然后使用 git筛选器分支 要使用替换执行存储库复制,请放弃替换,因为它现在已合并到复制的提交中。

    [ $GIT_COMMIT = <hash> ] && echo "-p <B-parent-hash>" || cat
    

    用作您的 --parent-filter .

        2
  •  0
  •   BoffinBrain    7 年前

    filter-branch 我的回购协议再次清理了“重复”提交。

    由于我的过滤过程只是从每次提交中删除特定文件,因此在修改后的repo(B)上再次运行相同的过滤器没有效果(B'=B),而在repo A中的提交上运行它会导致与B相同的提交。

    进一步阅读:

    How does git assure that commit SHA keys for identical operations/data are still unique?

    How to get the git commit count?