第一部分确实需要两个代码树。如果您使用的是分布式 SCM,例如 git、mercurial 或 bazaar,那么它不会太复杂:
- 一个 repo 是公开的、开源的,我们称之为
open-foobar
- 一个 repo 是私有的、闭源的,我们称之为
enterprise-foobar
- 在我看来,将开放存储库作为主存储库(上游)会更好,私有存储库会分叉和扩展,但这取决于您要保留多少代码。如果您的大部分提交将进入私有项目,那么将其作为您的主存储库是有意义的,但是这将更难以正确管理
- 您的本地克隆应该将两个存储库添加为远程,并且您应该在两个存储库之一上具有单独的本地分支跟踪分支,例如
master-open
轨道open-foobar/master
,而master-enterprise
轨道enterprise-foobar/master
- 您在分支中提交新的开放内容
master-open
,然后将其推送到开放存储库
- 您合并
master-open
到master-enterprise
,这意味着您将来自开放存储库的所有提交包含在私有存储库中
- 您在分支中提交新的私有内容
master-enterprise
,然后将其推送到开放的存储库,确保您不会意外地将这些提交合并到master-open
分支中。
- 当您想将私有提交包含到开放版本中时,您可以使用
git cherry-pick <commit-id>
仅复制提交而不暴露它来自私有分支的事实
这个工作流主要集中在 git 上,但它可以很容易地适应任何其他 SCM 系统。
对于第二部分,默认情况下,根据明确授予您所创建代码的所有版权的合同,您未付费的人提供的补丁将版权保留给代码的原始作者。这意味着除非他们授予您代码许可,否则您不能将其包含在您的私人分叉中。通常,这甚至不会授予您将其包含在开源项目中的许可,除非项目许可或补丁提交过程中以某种方式提及(通过单击提交按钮您授予许可......)。Apache 许可证在这里很好,因为它明确提到提交的补丁项目会自动获得许可,以便它们可以包含在代码中。我没有阅读zlib许可证,所以我不能说它是否有类似的条款;如果不确定包含一些要求用户同意他们授予您在项目许可下将任何补丁提交包含到开源项目中的权利的文本。
如果您还想将提交的补丁包含到您的私人项目中,那么您必须要求获得该代码的版权许可,以便包含在其代码的任何私人衍生品中。有关更多详细信息和一些示例,请参阅Wikipedia 关于 CLA 的文章。您可以查看Project Harmony的一些“标准”CLA。