我们有下面的Git层次结构,其中每个子层都是从父级分叉的。如果我们在Client1中构建了一些在整个层次结构中都有用的东西,那么将更改推到父级(不管是只在一个层次上,还是一直到根)的最好方法是什么,因为我们不希望将所有特定于客户端的自定义推到链上。
现在,虽然理想的解决方案可能是在最高要求的级别上进行开发,但模块只能在所有定制都实例化的链上进行真正的测试。
例如,如果我们开发了一个模块-- Client1回购中的新模块,并且需要将它推到核心,那么考虑到我们不希望客户1‘S在核心定制,那么最好的方法是什么呢?另一方面,如果我们最初在核心中直接开发了ModuleA,那么我们就必须将更改推到Client1的下游,以测试Module(并对每个更改进行迭代)。
是否有任何Git工作流或其他工具可以帮助建立这些规则。我们目前使用GitFlows管理我们的主机,开发和功能分支为所有的repos。另外,是否有一种方法可以禁用对远程存储库的直接推送?
CORE
|
------------------------
Product 1 Product 2
| |
---------- ----------
Client1 Client2 Client3 Client4
|-v1.0
|-v1.1
...发布于 2015-12-27 13:14:03
根据所使用的技术,可以禁用存储库中的直接推送。使用git钩子可以防止推送,但是如果使用gitlab/github/bitbucket.应该有办法保护树枝。
如果所有分支都受到保护,而且开发人员无法创建新的分支,那么就无法推送到回购。这样,您就必须使用“合并请求/推送请求”或调用它的方式来处理dev。
目前还不清楚您实际管理的是什么,所以下面的内容可能没有帮助。在我的例子中,我们有一个安装在每个客户端上的核心产品,核心产品可能以不同的版本安装。另外,还可以在侧面安装其他模块。无论哪种方式,客户端定制通常是通过为扩展现有模块(包括核心模块)的客户端安装特定模块来完成的。在我的例子中,客户端的自定义从未或很少出现在核心产品上。如果需要,我们可以简单地将模块转移到核心产品中。
如果一个自定义模块跨多个客户端共享,我们可以使用在每个模块存储库的主库上合并的特殊分支。
最后,如果代码不冒泡到每个模块的repo的主分支,就会变得非常复杂。在我们的例子中,大部分工作都是使用构建出来来管理repos、合并和依赖项。
使用git存储库处理依赖关系应该仅限于开发,即使只获取repos看起来更简单。Git存储库可能会变得相当大,有时如果存储库很大,并且internet连接是unstable...Git,则可能会失败,因此如果它在99%时失败,那么无论如何您必须从0%重新启动。
对于部署,我认为让包管理人员来做这件事更有意义。他们的存在,他们通常做好自己的工作。使用包管理器的优点是您不必下载模块可能带来的更改的全部历史记录。通常,包管理器允许使用http部分下载,因此如果internet失败,您可以在稍后暂停更新。有了一个好的包管理器,您还可以为每个客户端托管自己的私有包服务器。对于每个客户端来说,任何类似的模块都可以被推到中央服务器上,并且每个定制的包都可以被推送到每个客户端的包服务器上。
如果您有一种方法来自动化包的构建过程,并在各自的服务器上部署包,那么所有这些都很好。
这样,如果客户端执行类似于“包更新”的操作,它可以检查客户端服务器上的包,然后检查中央服务器,并从中获取正确的版本。旧包不必被删除,客户端可以根据他的意愿降低其设置的级别。
据我猜测,这是人们能实现的最美好的事情,但据我所知,还没有标准的方法来实现这一点。我听到人们用蟒蛇蛋做这件事,其他人用debian软件包等等。但每个实现都有自己的问题..。就像debian软件包不能在windows和非debian发行版上工作一样.蟒蛇的卵非常有限。npm包到javascript等等。如果我们有一个通用的包管理器,那将只是小菜一碟。
发布于 2016-08-25 08:31:06
使用源代码管理管理每个客户端代码定制不是一个好主意。这不是源代码管理设计的目的。
例如,在您的情况下,无法确定“新模块”是否依赖于分支中的自定义。所以你不能就这样把它合并起来,期望它能起作用。
正确的方法是将项目分解为组件,并为客户创建一个新的自定义组件。在部署客户端实例时,可以使用DI和配置来指定使用的是自定义组件,而不是标准组件。
所有组件都是单独的repos,并通过包管理器发布,以便将它们拖到其他项目中。
如果在定制组件之间使用公共功能,这些组件将再次被拆分,以便公共代码位于自己的模块中,而自定义组件引用它。因此,在您想要将代码移到“上一级”的场景中,您需要编辑公共组件以向其添加特性,并编辑自定义组件以从其代码中删除该特性,但要引用包含该特性的公共组件的新版本。
https://softwareengineering.stackexchange.com/questions/305916
复制相似问题