使用git实现高效的项目架构

5
首先,让我介绍一个项目的一般架构。
它是分层的。我们为客户开发服务器应用程序。它存储在主服务器上。
例如,本地服务器1、本地服务器2、...、本地服务器n是不同公司中的服务器(主应用程序实例)。每个公司都有一个本地服务器。大多数本地服务器具有相同的功能(例如核心模块),但每个公司都可以拥有自己的功能。作为一种解决方案,决定通过git分支来解决这个问题。
让我们考虑一些情况。
情况1: 一个公司(本地服务器x)想要一些仅在该公司需要的特定功能。按照分支思路,我们执行以下步骤:
1. 在主服务器上创建git分支 2. 为该服务器开发所需的功能 3. 在本地服务器x上创建git分支(分支y) 4. 将更改推送到主服务器 5. 在本地服务器x上切换到分支y 6. 在主服务器上切换到主分支
情况2: 我们开发了一些功能(核心模块中的更改)对所有公司都是通用的。
情况3: 我们开发了一些仅对某些公司通用的功能。
希望听取您关于如何解决“情况2”和“情况3”的建议。
3个回答

8
从技术上讲,@VonC是正确的,分支将是可行的方式。
但是有一个警告。您正在混合2种不同的范例。SCM(git是一种工具)意味着管理源代码及其不同版本。
启用/禁用产品功能是产品管理。基本上,它归结为应用程序的开发和部署。
您要做的是将产品的特性管理与版本管理相结合。
这当然是可行的(仅通过SCM),并且根据您的要求,它实际上可能对您很有帮助。
然而,随着时间的推移,您将会陷入分支/合并的困境。不仅会增加维护每个分支(并保持“主”和其他“分支”同步)的时间和精力,而且还会适得其反,因为每次有更改或新功能时,您都会花费更多的时间计划如何使您的分支保持最新状态而不是实际功能。如果您招聘了没有关于您的分支管理技巧的先前知识的新员工,并且如果您最终拥有分布式团队,他们可能想出自己的分支,那么这种情况就会变得更加复杂。
如果我可以建议,保留应用程序的一个版本,并实现启用/禁用“功能”的机制。这将使您的SCM更易于理解,更易于实现和维护。
一个中间地带是为核心模块设置一个核心分支,然后每个子模块或特性都是其单独的分支。任何人都可以安装核心模块,并根据需要/权限,他们可以从各自的分支中安装单独的“功能”。
希望这提供了一些清晰度。如果您有任何问题,我将乐意详细说明。

2

我基本上同意Mrchief的观点。

此外,我想提一下git分支在以下三种情况下最好使用:

  • 在单独的分支上开发功能,并在完成后将其合并到主线中。
  • 维护旧版本并进行错误修复或安全修复
  • 将当前版本的功能回溯到旧版本中

从长远来看,您应该计划将您的分支合并回主分支或停止它们。长时间运行许多分支并排运行并不是一个特别好的想法,因为迟早它们将与主分支(以及彼此)分歧,并且很难确保所有分支上都应用了错误修复或安全修复。


1
我们讨论的是一个带有客户端变体的核心模块,这意味着 git 子模块在这里不是一个有效的解决方案:
相同的文件集正在被修改(无论是为了公共特性,情况2,还是为了某些客户端的特性,情况3)。
因此,分支是处理这个问题的好方法,除非你需要将一个分支的合并管理到多个其他分支中。
对于这个问题,请参考类似 "如何在 DVCS 中跨分支移动错误修复?" 的问题。

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