0

我有一些我想为自己保留的封闭源代码(由我编写)。但是,我想在开源项目中使用其中的一些代码——这也将由我专门编写,但发布在某个地方供任何人使用。

我怎样才能完成这样的事情:

  1. 发布代码的开源版本,任何人都可以免费更改,保留或回馈(我相信这是zlib许可证)
  2. 同时,我想为自己准备一个代码版本,并能够合并 #1 中的任何代码更改(如果有人决定修复我发布的任何代码)

这就像拥有两个代码树一样简单,两者都附加了不同的许可证吗?一份 zlib 许可证,一份我自己的许可证?

请注意,我有点偏向于使用 zlib 许可证,因为它很短,我相信我理解它并同意它是合适的(我不介意有人将代码用于商业目的)。

4

2 回答 2

2

第一部分确实需要两个代码树。如果您使用的是分布式 SCM,例如 git、mercurial 或 bazaar,那么它不会太复杂:

  1. 一个 repo 是公开的、开源的,我们称之为open-foobar
  2. 一个 repo 是私有的、闭源的,我们称之为enterprise-foobar
  3. 在我看来,将开放存储库作为存储库(上游)会更好,私有存储库会分叉和扩展,但这取决于您要保留多少代码。如果您的大部分提交将进入私有项目,那么将其作为您的主存储库是有意义的,但是这将更难以正确管理
  4. 您的本地克隆应该将两个存储库添加为远程,并且您应该在两个存储库之一上具有单独的本地分支跟踪分支,例如master-open轨道open-foobar/master,而master-enterprise轨道enterprise-foobar/master
  5. 您在分支中提交新的开放内容master-open,然后将其推送到开放存储库
  6. 您合并master-openmaster-enterprise,这意味着您将来自开放存储库的所有提交包含在私有存储库中
  7. 您在分支中提交新的私有内容master-enterprise,然后将其推送到开放的存储库,确保您不会意外地将这些提交合并到master-open分支中。
  8. 当您想将私有提交包含到开放版本中时,您可以使用git cherry-pick <commit-id>仅复制提交而不暴露它来自私有分支的事实

这个工作流主要集中在 git 上,但它可以很容易地适应任何其他 SCM 系统。

对于第二部分,默认情况下,根据明确授予您所创建代码的所有版权的合同,您未付费的人提供的补丁将版权保留给代码的原始作者。这意味着除非他们授予您代码许可,否则您不能将其包含在您的私人分叉中。通常,这甚至不会授予您将其包含在开源项目中的许可,除非项目许可或补丁提交过程中以某种方式提及(通过单击提交按钮您授予许可......)。Apache 许可证在这里很好,因为它明确提到提交的补丁项目会自动获得许可,以便它们可以包含在代码中。我没有阅读zlib许可证,所以我不能说它是否有类似的条款;如果不确定包含一些要求用户同意他们授予您在项目许可下将任何补丁提交包含到开源项目中的权利的文本。

如果您还想将提交的补丁包含到您的私人项目中,那么您必须要求获得该代码的版权许可,以便包含在其代码的任何私人衍生品中。有关更多详细信息和一些示例,请参阅Wikipedia 关于 CLA 的文章。您可以查看Project Harmony的一些“标准”CLA。

于 2013-01-03T04:29:10.153 回答
1

Apache 小组和其他组织要求代码提交者“签署”任何更改的所有权。你也需要这样做。在您接受修复或增强之前,他们必须签署代码。

于 2013-01-03T01:36:51.717 回答