我们已经使用git-flow
一段时间来开发软件框架。我们在单个存储库中有master
和development
分支。
最近,不同的客户开始对框架感兴趣,这需要为每个客户定制框架。
到目前为止,我们为母版中的每个客户创建了一个新的feature-customerXYZ
分支,在定制完成后(在那里防止了产品{{1 }} / master
分支来自自定义)。
与此并行的是,框架本身的开发将继续使用产品development
,master
,development
,features
和{ {1}}分支。
在这种情况下,有两种常见的情况发生,我认为我们的工作流程无法最佳处理:
hotfixes
分支的开发可以包含值得在产品release
/ feature-customerXYZ
分支中实现的提交。由于master
分支永远都不会关闭,因此这些提交必须是对product分支的development
或feature-customerXYZ
,自定义后需要额外的工作并且容易出错。
在rebased
分支打开时发现的修补程序由cherrypicked
处理,方法是仅对产品feature-customer
和{ {1}}分支,但不会合并到打开的git-flow
分支中(更确切地说:它们不会合并到所有打开的hotfix
分支中。)
是否有一个git工作流程可以简洁地处理此问题?对于产品master
/ development
或开放的feature-customer
分支,是否有聪明的替代方法来代替feature
,merge
或cherrypick
的提交分别?
答案 0 :(得分:3)
虽然按照@VonC的建议,在理论上可以在专用分支机构中保持客户差异,但我敢说这在技术上非常困难并且无法扩展。
是的,您可以拥有一些工作(使用Jenkins或其他工具),这些工作将自动根据主分支调整您的偏差,但是在工具方面,您是一个人。至少要为以下情况做好准备:
相反,我建议最小化偏差,然后将所有偏差并排放置在单个分支中。
如果您的项目由模块组成,则通常可以这样做。您没有提到项目的任何细节,但是大多数语言都支持某种形式的模块化,因此我希望您也是如此。
这样,您可以尝试将偏差的扩展点集中到最小模块(最好是一个模块)中,并在项目中具有这些模块的多个变体。
优势显而易见:
唯一的缺点是,当您只为一个客户发布项目(带有标签和其他仪式)时,您对所有其他客户也都这样做。通常这没什么大不了的,另一方面,它会促使按功能进行偏差,这很好。
为了最小化偏差,我建议采用以下技术:
仅作总结-最小化偏差并并排构建所有偏差。
将您的代码库扩展到多个主分支(每个客户)将很快变得难以维护。
答案 1 :(得分:1)
还使用合并请求合并
feature-customerXYZ
的全部有效提交进行开发吗?
是的
因此,项目维护者可以选择代码的哪些部分对产品主/开发有用?
否:项目维护者应该只接受合并不容易的PR(快速转发),并运行测试以验证PR是否有效。
他/她不负责选择部件:只有开发人员才可以选择它们(因为他/她知道需要暴露在dev
/ master
中的内容。
因此,对于第一种情况,仍然需要使用Cherry-pick或rebase来创建专用分支(与功能部件分离),然后将其通过PR提交给开发人员或主用户进行验证。
对于情况2,应该合并修补程序以进行开发,并且每个功能分支都可以在自己的时间rebase on the latest develop state(因此包括主机修补程序)