git子树别无选择,只能重复提交吗?

时间:2016-08-02 07:37:11

标签: git git-subtree

我刚开始使用git子树,我感到很困惑。

  1. 我有"主要"回购和"子树"回购。
  2. " main"回购包括"子树"回购。
  3. 在这种情况下,我的问题是 '"主要" repo别无选择,只能重复提交?'。

    例如,让我们假设我将一些提交推送到" main"回购,并制作了子树推送'到"子树"回购。

    之后,当我点击git subree pull~'命令" main" repo,所有提交,甚至是我从'#34; main"到"子树"被拉到"主要"回购,"主要" repo得到重复的提交。

    难道不可避免吗?或者我犯了错误吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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

<块引用>

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

应该始终使用它,否则您将引入重复项。您不会以这种方式看到任何远程提交历史记录。

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

git-alltrees

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

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

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

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