【问题标题】:How to track two version of a project in one GIT repository?如何在一个 GIT 存储库中跟踪项目的两个版本?
【发布时间】:2010-01-08 01:02:51
【问题描述】:

我在一个本地 git 存储库中有一个项目的两个版本。我必须将此存储库提交到 2 个远程存储库中,每个版本一个;

本地 GIT(V1/V2) -> 远程 GIT(V1)、远程 GIT(V2)

我在 LOCAL GIT 存储库中有一些文件只能转到 REMOTE GIT(V1),而其他文件只能转到 REMOTE GIT(V2)。现在我将完整的本地存储库提交到两个遥控器。 我只能将一些文件提交到 REMOTE1 吗?

我需要将项目的两个版本都放在一个存储库中,但希望有一个选项来划分历史记录。我认为任何分支都无济于事,因为那时我必须对两个分支进行相同的更改。大部分代码,90% 的代码对于 VER 1 和 VER 2 是相同的。两个版本的新代码通常是相同的。

【问题讨论】:

  • 最好先了解(并在此处发布)您要实现的目标。最小可能的存储库大小?需要将 VER1 分支出来的东西合并到 VER2 吗?还有什么?

标签: git history


【解决方案1】:

分支正是您所需要的。使用 Git 可以轻松快速地进行分支,因此您只需敲几下键盘就不会丢失任何内容。

您可以使用 3 个分支。创建一个“公共”分支,您将在其中处理两个“叉子”共有的东西,并在提交后合并到它们中。对于特定的东西,在其中一个分支机构工作。

Git 在文件系统上使用硬链接,因此分支在速度和使用空间方面都很便宜。

最后,您可以随时选择要推/拉的分支。

【讨论】:

  • 由于“硬链接”,分支机构并不便宜。分支很便宜,因为分支只是一个提交,它通过 SHA1 id 引用它的所有部分,并且不同提交树中的相同文件将具有相同的 SHA1,并且只存储一次。现在,SVN,另一方面,通过具有完整的目录结构来存储分支,并且确实使用硬链接来优化它。请不要将旧的、丑陋的 SVN 与新的 slick git 混淆。
  • @Randal:SVN 也不使用文件系统硬链接。 SVN 中的分支也很便宜,因为它“只是一个提交”。唯一不同的是,在 SVN 中廉价的文件/文件夹副本,分支和标签都是由相同的机制制作的,而在 git 中,分支是一个单独的概念。
【解决方案2】:

创建三个 Git 存储库:coreapp_1app_2。在每个 app 存储库中,创建一个引用 core 存储库的 Git 子模块。

core 存储库视为纯库,将app 存储库视为纯库使用者,构建三个项目,以便您可以保留core 存储库中两个“版本”的所有共同点以及所有app 存储库中的两个版本之间会出现差异。构建app 存储库,使core 项目可以不加修改地批量放置到app 存储库中的子目录中。您可能需要在所有 app 存储库之间共享一个最小的通用初始化脚本,但这是一个很小的代价。

以这种方式构建代码的场景非常普遍。虽然以这种方式使用 Git 来支持这种代码架构场景的情况要少得多,但它被视为一种可行的可能性。

【讨论】:

    【解决方案3】:

    听起来您需要使用子模块git-submodule。您可以将公共代码存储在主存储库中,然后将单独的版本存储在子模块中。你不能用 git 分割历史。每个提交都基于内容和父项以加密方式进行。

    【讨论】:

    • 子模块用于将另一个项目嵌入到源代码树中某个位置的外部存储库中。 OP 只有一个项目(具有不同的分支),因此子模块不相关。
    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    相关资源
    最近更新 更多