所以我们有应用程序Pluto和应用程序Goofy - 都使用相同的SVN项目。实际上只有一点配置差异。
现在我面临这个问题:来自Pluto的客户需要一些新的改变 - 详细说明,他希望为Javascript和我们在JSF环境中使用的一些xhtml标签添加功能。基本上,这是他要求的javascript改进 - 旧功能必须仍然存在。但是:新功能可能会破坏Goofy的部分功能,因为Goofy是一个更大的应用程序,很难测试。实际上高飞是冥王星的超集 - 例如高飞可以做冥王星所做的一切 - 但事实上它只是用于测试,最终产品存在于冥王星中。
需要更改的文件非常静态,我认为其中一个文件的最后一次更改超过半年前。过去两年肯定不会有太多变化。
我想到的是为Pluto创建一个分支,我实现了对javascript和xhtml标记的所有更改。开发人员将在trunk上开发,我将在部署之前始终合并分支的更改(这可能会自动完成)。 但是:本地开发存在一个问题 - 由于它是主干,新功能只在分支上,因此在为Pluto本地开发时,新功能将无法使用。
另一种方法是使用例如如果申请==高飞加载javascript高飞,反之亦然。
或者最后 - 尝试和错误,例如只需合并所有更改并修复错误: - )
你们如何决定这个?
答案 0 :(得分:3)
我会使用不同的分支,并接受在一周中的任何一天使用if application==Goofy
之类的特殊技巧进行合并的不便。当您的程序复杂性增加并且可能添加更多应用程序时,后一种实现将肯定会让您失望。
另一种可能更适合您的方法是重构代码并将应用程序的核心部分分解为自己的项目。然后让每个应用程序分别引用核心项目。例如,核心部分可以包含业务逻辑,而Goofy / Pluto处理GUI和/或某些核心部分的特殊实现。您的SVN树看起来类似于:
trunk
|--- Core stuff
|--- Project Pluto
|--- Project Goofy
更复杂但非常灵活的方法是将Core内容移动到自己的存储库中。然后,您可以使用svn:externals
将核心部分包含到项目中。这将使您能够将Pluto和Goofy锁定到Core Stuff的某些修订版本。因此,您可以更新Core内容以添加一个项目所需的更多功能,但对另一个项目有害或不受欢迎。我已经看到了这一点,它运作良好。我们的遗留代码非常过时但仍在编译和工作,即使遗留项目的开发已经停止,核心部分已经升级多年。
Core trunk
|--- Core stuff (rev 123)
Application trunk
|--- Project Pluto (Core rev 111)
|--- Project Goofy (Core head)
如果您想使用最后一个选项,博文svn:externals应该会有所帮助。