用于产品开发和产品定制的git工作流程

时间:2018-09-20 15:06:17

标签: git version-control git-rebase git-flow git-cherry-pick

我们已经使用git-flow一段时间来开发软件框架。我们在单个存储库中有masterdevelopment分支。

最近,不同的客户开始对框架感兴趣,这需要为每个客户定制框架。

到目前为止,我们为母版中的每个客户创建了一个新的feature-customerXYZ分支,在定制完成后(在那里防止了产品{{1 }} / master分支来自自定义)。

与此并行的是,框架本身的开发将继续使用产品developmentmasterdevelopmentfeatures和{ {1}}分支。

在这种情况下,有两种常见的情况发生,我认为我们的工作流程无法最佳处理:

  1. hotfixes分支的开发可以包含值得在产品release / feature-customerXYZ分支中实现的提交。由于master分支永远都不会关闭,因此这些提交必须是对product分支的developmentfeature-customerXYZ,自定义后需要额外的工作并且容易出错。

  2. rebased分支打开时发现的修补程序由cherrypicked处理,方法是仅对产品feature-customer和{ {1}}分支,但不会合并到打开的git-flow分支中(更确切地说:它们不会合并到所有打开的hotfix分支中。)

是否有一个git工作流程可以简洁地处理此问题?对于产品master / development或开放的feature-customer分支,是否有聪明的替代方法来代替featuremergecherrypick的提交分别?

2 个答案:

答案 0 :(得分:3)

虽然按照@VonC的建议,在理论上可以在专用分支机构中保持客户差异,但我敢说这在技术上非常困难并且无法扩展。

是的,您可以拥有一些工作(使用Jenkins或其他工具),这些工作将自动根据主分支调整您的偏差,但是在工具方面,您是一个人。至少要为以下情况做好准备:

  • rebase将发生冲突-很简单,git会让您知道
  • 重新设置将成功,但是结果将包含逻辑冲突-这需要良好的测试范围,因为没有工具能够警告您

相反,我建议最小化偏差,然后将所有偏差并排放置在单个分支中。

如果您的项目由模块组成,则通常可以这样做。您没有提到项目的任何细节,但是大多数语言都支持某种形式的模块化,因此我希望您也是如此。

这样,您可以尝试将偏差的扩展点集中到最小模块(最好是一个模块)中,并在项目中具有这些模块的多个变体。

优势显而易见:

  • 很简单
  • 您的CI易于配置,可以一次构建所有模块(=客户偏差)
  • 您可以对它们进行测试,并轻松确定哪个测试是针对单个客户的,哪个是通用的,哪个是特定于偏离功能而不是客户的
  • 此外,您也不必因此而锁定分支模型,并且仍然可以使用git-flow或任何适合您的需求

唯一的缺点是,当您只为一个客户发布项目(带有标签和其他仪式)时,您对所有其他客户也都这样做。通常这没什么大不了的,另一方面,它会促使按功能进行偏差,这很好。

为了最小化偏差,我建议采用以下技术:

  • 可以通过配置选项更好地表示一些偏差
  • 其他人可能特定于功能而不是客户特定
  • 最好的,某些偏差可能会被拒绝-尽管这种情况很少发生

仅作总结-最小化偏差并并排构建所有偏差

将您的代码库扩展到多个主分支(每个客户)将很快变得难以维护。

答案 1 :(得分:1)

  

还使用合并请求合并feature-customerXYZ的全部有效提交进行开发吗?

是的

  

因此,项目维护者可以选择代码的哪些部分对产品主/开发有用?

否:项目维护者应该只接受合并不容易的PR(快速转发),并运行测试以验证PR是否有效。
他/她不负责选择部件:只有开发人员才可以选择它们(因为他/她知道需要暴露在dev / master中的内容。

因此,对于第一种情况,仍然需要使用Cherry-pick或rebase来创建专用分支(与功能部件分离),然后将其通过PR提交给开发人员或主用户进行验证。

对于情况2,应该合并修补程序以进行开发,并且每个功能分支都可以在自己的时间rebase on the latest develop state(因此包括主机修补程序)