【问题标题】:Git submodule management strategyGit子模块管理策略
【发布时间】:2011-04-27 13:54:28
【问题描述】:

我们使用 GIT 来管理我们的项目。

每个项目都有一个“核心”(就像我们将构建项目的框架一样)所以每个项目至少有 2 个远程分支:

  • 该核心框架的 1 个存储库。
  • 每个客户项目 1 个存储库。

我们也有模块。每个模块都有一个包含基本功能的核心,我们根据该基础为每个客户个性化每个模块。

  • 所以我们在每个客户项目中都包含子模块
  • 但我不知道如何处理子模块的个性化部分。

如果我想在子模块中添加一些只能在 1 个特定客户端项目中使用的新文件,GIT 如何帮助我?

由于这些文件是针对主项目进行个性化的,最好的情况是提交客户端项目分支中子模块中包含的一些文件,但看起来我不能,因为每个子模块都是独立的。

Ps.:我们使用 SmartGit。

【问题讨论】:

    标签: git git-submodules smartgit


    【解决方案1】:

    这是一个可以使用git-subtree(合并)的场景

    如果您对另一个进行了更改 项目在您的存储库中,他们可能 想从你的项目中合并。这 可以使用子树 — 它可以 向上移动树中的路径并 那么他们只能合并相关的 树的一部分。

    http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html

    子树合并的思想是 你有两个项目,其中一个 项目映射到 另一个,反之亦然。当你 指定子树合并,Git 很聪明 足以弄清楚一个是 另一个的子树并合并 恰如其分——真是太棒了。

    http://progit.org/book/ch6-7.html

    但我想你想使用子模块而不是远离它。

    【讨论】:

    • 我对子模块的唯一兴趣是因为如果我们在模块的核心中修复某些东西,那么在每个项目中应用更改真的很容易。
    【解决方案2】:

    我不能因为每个子模块都是独立的。

    虽然子模块确实是“独立的”,但由于它有自己的一组提交和分支作为单独的存储库,您仍然可以在所述子模块上定义客户端项目分支。

    该分支将在您的主客户端项目存储库以及核心子模块中定义,以便隔离在两个存储库中完成的特定于客户端项目的更改。
    当您推回在核心子模块中完成的这些更改时,您会将它们推送到客户端项目分支中,其名称与客户端父存储库中使用的客户端分支的名称相匹配。

    因此,简而言之,命名约定可以帮助您隔离在许多客户端项目存储库使用和共享的核心子模块中完成的小的特定更改。

    【讨论】:

    • 但是分支必须是远程的才能在所有开发者之间共享。那么这是否意味着我必须为每个客户端的每个子模块版本创建 1 个存储库?所以如果我使用 10 个子模块,我将不得不创建 11 个存储库来处理 1 个项目?
    • @FMaz008:“每个子模块 1 个存储库”:子模块 已经是一个存储库。如果您在项目客户端中使用 10 个子模块,则在 .submodules 文件中引用它们。在父 repo 或其中一个子模块中创建的每个分支在推送到各自的上游 repo 后将被共享。
    • 是的,那部分我明白了。这样可以确认我必须为每个项目创建尽可能多的存储库。
    • @FMaz008:我不确定您所说的“创建回购”是什么意思:它们应该已经存在。您将要做的是获得一个本地工作目录,其中包含一个父 repo,并由父 repo 引用的所有子模块 repo 递归。每个客户项目将直接使用一个 repo(一个客户项目 repo),其中每个引用都包含您需要的所有核心子模块。
    • 你描述的听起来像我的实际设置。但问题是,当我在该项目中引用的子模块中修改特定于客户端 1 项目的内容时,它会被推送到子模块存储库。所以当我进入client2项目并拉取时,我得到了具体的修改:(。问题:我无法区分Core和Specifics。
    猜你喜欢
    • 2018-08-14
    • 1970-01-01
    • 2016-09-10
    • 2021-09-21
    • 2010-10-24
    • 2019-04-12
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多