Git子模块管理策略

4
我们使用GIT来管理我们的项目。
每个项目都有一个“核心”(就像我们将从中构建项目的框架)。因此,每个项目至少有两个远程分支:
1. 该核心框架的存储库。 2. 每个客户项目的1个存储库。
我们还有模块。每个模块都有一个包含基本功能的核心,并且我们根据每个客户对该模块进行个性化定制。
因此,我们有子模块,这些子模块包含在每个客户项目中。但是,我无法想象如何处理子模块的个性化部分。
如果我想要在只用于1个特定客户项目的子模块中添加一些新文件,GIT能帮助我吗?
由于这些文件是为主项目个性化的,因此最好的情况是在客户项目分支中提交子模块中包含的某些文件,但看起来我无法这样做,因为每个子模块都是独立的。
附注:我们使用SmartGit。
2个回答

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

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


我对子模块的唯一兴趣是,如果我们在一个模块的核心部分修复了某些东西,那么很容易将更改应用于每个项目。 - FMaz008

0
每个子模块都是独立的,所以我不能这样做。
虽然子模块是“独立”的,因为它有自己的提交和分支作为一个单独的存储库,但您仍然可以在该子模块上定义客户端项目分支。
该分支将在您的主客户端项目存储库中定义,以及在核心子模块中定义,以便隔离在两个存储库中完成的特定于客户端项目的更改。当您将这些在核心子模块中完成的更改推回时,您将它们推到一个客户端项目分支中,其名称与客户端父存储库中使用的客户端分支的名称相匹配。
简而言之,命名约定可能会帮助您隔离在许多客户端项目存储库中使用和共享的核心子模块中完成的小型特定更改。

但是分支必须是远程的,才能在所有开发者之间共享。那么这是否意味着我必须为每个客户端的每个子模块版本创建1个存储库?如果我使用10个子模块,那么我将不得不创建11个存储库来处理1个项目吗? - FMaz008
@FMaz008:“每个子模块一个仓库”:子模块本身就是一个仓库。如果您在项目客户端中使用了10个子模块,则会在您的“.submodules”文件中引用它们。在父仓库或其中一个子模块中创建的每个分支都将在推送到其各自的上游仓库后共享。 - VonC
是的,我理解那部分。这意味着我需要为每个项目的子模块创建一个仓库。 - FMaz008
@FMaz008:我不确定你所说的“创建repo”是什么意思:它们应该已经存在。你要做的是获取一个本地工作目录,其中包含一个父repo,并递归地包含所有由父repo引用的子模块repo。每个客户端项目将直接使用一个repo(客户端项目repo),其中包含对你需要的所有核心子模块的引用。 - VonC
你所描述的听起来像是我的实际设置。但问题在于,当我修改子模块中特定于客户1项目的某些内容时,它会被推送到子模块存储库中。因此,当我进入客户2项目并拉取时,我会得到这个特定的修改 :( 。问题在于:我无法区分核心和具体内容。 - FMaz008

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接