【问题标题】:Does git subtree have no choice but to have duplicated Commits?git subtree 除了重复提交别无选择?
【发布时间】:2016-12-07 10:54:27
【问题描述】:

我刚开始使用 git subtree,我很困惑。

  1. 我有“主”存储库和“子树”存储库。
  2. “主”存储库包括“子树”存储库。

在这种情况下,我的问题是 '“主要”回购别无选择,只能重复提交?'。

例如,假设我将一些提交推送到“主”存储库,并将“子树推送”到“子树”存储库。

之后,当我在“main”repo 上点击“git subtree pull ~”命令时,所有提交,甚至是我从“main”推送到“subtree”的内容都被拉到“main”repo 和“main”repo获得重复的提交。

这是不可避免的吗?还是我做错了?

【问题讨论】:

    标签: git git-subtree


    【解决方案1】:

    将一个存储库集成到另一个存储库有两种不同的方式:子模块和子树。

    子树通过将所有提交“复制”到目标存储库来工作,然后可以“独立存在”。

    子模块通过“引用”来自另一个存储库的提交来工作。不需要“复制”,但这需要之后访问两个存储库。

    所以是的。子树“复制”你的提交是完全正常的。

    【讨论】:

    • 问题不在于这种重复是否“正常”。这是是否可以避免重复。如果 Git 能够只存储子树提交的 sha1 哈希而不是整个提交,那么它似乎会带来巨大的好处,这会快照整个子树存储库。这对于大型子树存储库特别有用。
    【解决方案2】:

    首先,使用现有的 git-subtree 工具,可以通过使用 git-subtree 的 --squash 选项来避免。这通过简单地抑制所有提交来“避免”问题。从手册页:

    --壁球
    此选项仅对添加、合并和拉取命令有效。 与其合并子树项目的整个历史记录,不如只生成一个包含您要合并的所有差异的提交,然后将该新提交合并到您的项目中。

    应该一直使用它,否则你会重复使用它。这样您将看不到任何远程提交历史记录。

    如果您想保留远程提交历史记录,从某种基本意义上说,重复并非不可避免。使用之前描述的、已实现的(可能是已知的)子树方法,它们是不可避免的。

    git-alltrees

    通过使用更复杂的翻译策略来避免这些重复。 要了解重复项,您必须了解什么标识了提交。它们由它们的哈希标识,哈希是一个校验和,基本上取决于与提交相关的所有数据。这包括一些内容,包括明显的提交内容以及存储在提交中的父 ID。因此,如果一个提交发生更改,所有后代哈希都会更改。

    使用子树,当您推送到远程时,您显然会更改内容。文件被删除,目录被改变。哈希改变。当你拉回提交时,目录可以改回来,但文件仍然丢失。

    git-alltrees 将拉取分支中的部分提交重新关联并替换为其原始提交,从而恢复原始哈希。从远程进行的任何新提交都会自然地分支和合并。这项工作是使用 git-filter-repo 完成的。

    我并不想隐瞒这是我的工作,而是旨在准确回答这个问题的工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-06
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 2011-11-01
      • 2021-10-12
      • 1970-01-01
      相关资源
      最近更新 更多