最初の部分では、実際に 2 つのコード ツリーが必要です。git、mercurial、bazaar などの分散 SCM を使用している場合は、それほど複雑ではありません。
- 1 つのレポは公開されており、オープン ソースです。
open-foobar
- 1 つのレポは非公開のクローズド ソースです。
enterprise-foobar
- 私の意見では、プライベート リポジトリがフォークして拡張するメインリポジトリ (アップストリーム)としてオープン リポジトリを使用する方がよいと思いますが、それはプライベートに保持したいコードの量によって異なります。コミットのほとんどがプライベート プロジェクトに送られる場合、それをメイン リポジトリにすることは理にかなっていますが、これは適切に管理するのが難しくなります。
- ローカル クローンは、両方のリポジトリをリモートとして追加する必要があります。また、2 つのリポジトリのいずれかで個別のローカル ブランチを追跡する必要があります (たとえば、
master-open
track open-foobar/master
、 while master-enterprise
trackなど)。enterprise-foobar/master
- ブランチで新しいオープンなものをコミットし
master-open
、それをオープン リポジトリにプッシュします
- にマージ
master-open
しmaster-enterprise
ます。つまり、オープン リポジトリからのすべてのコミットをプライベート リポジトリに含めます。
- ブランチで新しいプライベートなものをコミットし、それをオープン リポジトリにプッシュして、誤ってこれらのコミットをブランチ
master-enterprise
にマージしないようにします。master-open
- プライベート コミットをオープン バージョンに含めたい場合は
git cherry-pick <commit-id>
、プライベート フォークからのものであるという事実を公開せずにコミットをコピーするだけで済みます。
このワークフローは git を中心にしていますが、他の SCM システムにも簡単に適用できます。
2 番目の部分については、既定では、作成されたコードのすべての著作権を明示的に付与する契約に基づいて支払われていない人からのパッチは、コードの元の作成者に著作権を保持します。これは、コードのライセンスが付与されない限り、プライベート フォークに含めることができないことを意味します。通常、プロジェクトのライセンスまたはパッチの送信プロセスで何らかの形で言及されていない限り (送信ボタンをクリックしてライセンスを付与する...)。パッチが提出されたことを明示的に言及しているので、Apacheライセンスはここで良いですプロジェクトに自動的にライセンスされ、コードに含めることができます。私は zlib ライセンスを読んでいないので、同様の条項があるかどうかはわかりません。プロジェクトのライセンスに基づいて、オープン ソース プロジェクトにパッチの提出を含める権利をユーザーに付与することに同意するようユーザーに要求するテキストを含めることが確実でない場合。
提出されたパッチをプライベート プロジェクトにも含めたい場合は、そのコードのプライベートな派生物に含めるために、コードの著作権ライセンスを要求する必要があります。詳細といくつかの例については、ウィキペディアの CLA に関する記事を参照してください。いくつかの「標準」CLA については、Project Harmony を参照してください。