7

我有一个包含我开发的站点的主存储库,我希望这个主存储库包含我正在开发的产品的基本通用内容。此主存储库将用作将由多个客户端使用的站点的起点。这些客户端中的每一个显然都有不同的设置(例如数据库连接,也许还有品牌),但将来也可能包含自定义功能。

我想做的是拥有主存储库,然后从主分支为每个客户端分叉,然后对这些分叉进行任何类型的定制。所以它看起来像:

掌握
   A公司  
   B公司  
   C公司

我主要关心的问题之一是如何同步更改?我认为客户的分叉不会有影响主控的变化,但主控的变化肯定会影响分叉。这会是一场巨大的噩梦吗?这是处理这种情况的最佳方法吗?

4

5 回答 5

6

我会使用rebase。此命令将您的分支回退到它与主分支不同的点,然后在其之上重放您的更改。假设你有这个(从手册页借来的 ascii 艺术):

      A---B---C company_a
     /
D---E---F---G master

做这个:

git checkout company_a
git rebase master

你会留下这个。

              A'--B'--C' company_a
             /
D---E---F---G master

所有这一切都是自动完成的。如果发生冲突,git 将暂停 rebase 并允许您解决它。差异查找冲突,然后

git add conflicting_file
git rebase --continue

或胆怯:

git rebase --abort

这只是一个摘要,所有内容都在手册页中。

于 2013-11-15T17:14:59.733 回答
2

我经历过,这是一个令人难以置信的混乱。通常发生的情况是,您的工作流程最终会变成:忘记 master 并从最近的客户端分叉。然后它很快就变成了一场噩梦。

我强烈建议重构代码以将内容拆分为 2 个独立的 git 模块,一个“核心”,一个用于(每个)公司特定代码。如果不知道你回购的确切性质,很难说。我已经在工作中看到,拆分模块比 repo 中的一堆客户分支更易于管理。

于 2013-11-15T18:46:22.703 回答
1

我认为这里最好的选择是使用子模块。为每个客户创建一个包含每个客户内容的存储库,并将公共核心存储库添加为每个客户的子模块。可能需要对子目录等进行一些重新排列,但这将允许您开发公共核心并按照自己的时间表升级每个客户。一个缺点是它为所有额外的子模块副本占用了更多的磁盘空间——不过,这可以通过使用git共享对象存储功能来部分缓解,而且磁盘空间无论如何都很便宜。

您可能可以使用每个客户分支的方法在单个存储库中完成您想要的事情,但是保持所有分支保持直线并确保您不会意外交叉合并或其他事情,需要谨慎。

于 2013-11-15T17:27:26.220 回答
1

我尝试过并且有效的是为您的产品代码创建一个存储库,例如product_x. 您为每个客户端分叉它,从而产生单独的存储库,如下所示:

product_x_company_a, product_x_company_b, product_x_company_c,

由于拉取请求不允许从父母到孩子,但只允许从孩子到父母,我们必须遵循不同的路线。

我在本地做什么,是在每个公司存储库中添加,例如product_x_company_a 除了origin有自己的 repo url,也parent指向product_xrepo

git remote add parent https://github.com/ourcompany/product_x.git

如果您键入git remote -v,您将在此特定文件夹中看到类似的列表:

origin  https://auser@github.com/ourcompany/product_x_company_a.git (fetch)
origin  https://auser@github.com/ourcompany/product_x_company_a.git (push)
parent  https://auser@github.com/ourcompany/product_x.git (fetch)
parent  https://auser@github.com/ourcompany/product_x.git (push)

然后可以从本地子存储库中提取推送到产品的更改,如下所示:

git pull parent master

如果一切都按预期在本地工作 - 它们可以像这样被推送到特定的客户回购:

git push origin master

您通常不需要提交某些内容,因为您基本上将提交从一个仓库传递到另一个仓库!

您可以在这些存储库中更改公司特定的代码,同时如果产品(父级)中开发了错误或功能,则可以轻松地将其推送给所有客户 :)

请注意,最好不要直接在分支上master而是在dev分支上完成,这样您就可以在进入生产分支之前先运行单元测试、集成测试、代码质量指标和手动测试。

于 2018-11-27T15:28:21.583 回答
0

源代码管理是处理此问题的好方法。当您将 Master 合并/变基为 A 时,Master 中的第 10-20 行已更改,A 中的第 15-25 行已更改,然后合并后:

lines 10-15 will match what's in Master
lines 15-20 will be marked as in-conflict, and you'll have to resolve the differences manually, use your favorite tool like diffmerge
lines 20-25 will match what's in A

我猜自定义内容将出现在绒毛内容区域中,而您的大部分 Master 更改将是基本功能。在这种情况下,您的项目可能不会经常出现冲突。因此,在大型项目中手动协调第 15-20 行中的冲突可能会很痛苦,但它仍然可能是处理您的情况的最佳方式。

于 2013-11-15T17:20:08.217 回答