Github でオープンソースの Rails アプリをリリースしています (おそらく MIT ライセンス)。また、有料サービスの一部として使用するプロジェクトのプライベート ブランチ/フォークを維持したいと考えています。
このシナリオでリポジトリを整理する最良の方法は何ですか? また、両方に行く必要がある更新がある場合、どうすればプロジェクトの同期を保つことができますか?
Github でオープンソースの Rails アプリをリリースしています (おそらく MIT ライセンス)。また、有料サービスの一部として使用するプロジェクトのプライベート ブランチ/フォークを維持したいと考えています。
このシナリオでリポジトリを整理する最良の方法は何ですか? また、両方に行く必要がある更新がある場合、どうすればプロジェクトの同期を保つことができますか?
最も簡単な解決策は、「プライベート」リポジトリにプライベート ブランチを作成することです。つまり、単にパブリック リポジトリにプッシュされないブランチです。
そのためには、(グロビング ミラーリング refspec を使用する代わりに) config でパブリック リポジトリにプッシュするすべてのブランチを指定するか、+refs/*:refs/*
公開するブランチを慎重にプッシュして、一致するブランチをプッシュする Git の動作に依存する必要があります (リモート側に存在する) "push.default" を現在のデフォルト値 "matching" に設定します。
誤ってプライベート ブランチをプッシュしてしまった場合は、"git push < remote > :refs/heads/< private-branch >" を使用して (これを禁止するように構成されていない限り) リモート リポジトリでそれを削除できます (これを覚えておくために: push empty値をリモート ブランチに)。リモート側でフックを使用して、プライベート ブランチを誤ってプッシュしないように保護できます。たとえば、contrib/examplesの update-paranoidサンプル フックを参照してください。
補足: Junio C Hamano (git メンテナー) は、指定された一連のブランチのみをパブリック git リポジトリにプッシュします: 'maint'、'master'、'next'、'pu' (提案された更新)、および 'html'、'man'、' todo'; 彼は、短命で頻繁に変更される機能ブランチを公開しません。
作業リポジトリ ----> プライベート リポジトリ (ベア) ----> パブリック リポジトリ \------ プライベート -------/ \------- 保護 ------------/ \------- パブリック --- --/
「作業リポジトリ」は、変更をプルして競合を解決する、コミットを行う作業領域を持つリポジトリです。作業を行うリポジトリ。次のブランチが含まれているとしましょう: 世界に公開できる変更を含む「パブリック」、他のユーザーと共有したくない、または選択した一部の人々とのみ共有したい「プライベート」、およびおそらく「ticket-」などのいくつかの機能ブランチが含まれているとします。 234' または 'add-frobnicator' であり、選択したグループが表示する準備ができていません。このリポジトリは公開されていないため、裸ではありません。
「プライベート」リポジトリにプッシュするための次のような構成になります。ここでは、「ブランチの一致」動作が明示的に設定されていることに注意してください。git-pullマンページを参照してください。
[remote "private"]
url = user@example.com:/srv/private/git/repo.git
push = +:
「プライベートリポジトリ」は、選択した人だけが利用できる公開のベアリポジトリです。たとえば、SSH 経由でのみ取得できます。準備ができているブランチ、つまり「パブリック」ブランチと「プライベート」ブランチのみがあります。これらのブランチは、「プライベート」リポジトリの作成時に存在したか、「作業中」リポジトリから明示的にプッシュ (「git push private <branch> 」) されたものです。「作業」リポジトリからのプッシュは、一致するブランチのみ、つまり「パブリック」ブランチと「プライベート」ブランチのみをプッシュ (転送) します。
「プライベート リポジトリ」には、プッシュされた場合にのみpost-update
「パブリック」ブランチを「パブリック リポジトリ」(以下を参照)にpost-receive
プッシュするフック セットがあります(まあ、無条件にプッシュできます)。
「公開リポジトリ」は、誰もが利用できる公開の裸のリポジトリです。たとえば、GitHub、および/または Gitorious、および/または repo.or.cz でホストされているか、git://
git-daemon を使用してプロトコル経由で提供されている可能性があります。これには「パブリック」ブランチのみが含まれており、update
orを使用pre-receive
してブランチの whilelist を受け入れる (ここでは「パブリック」ブランチのみが受け入れられます) か、ブランチのブラックリストを拒否します (この例では、「プライベート」ブランチへのプッシュ/作成は拒否されます)。 . 「プライベート」リポジトリにプッシュすると、自動的に更新されます。
このセットアップは、必要に応じて非常に複雑になる場合があります。あなたの場合、「プライベート」リポジトリは必要ないかもしれません。このような場合、「公開リポジトリ」に直接プッシュするための「作業リポジトリ」の構成は次のようになります。
[repository "public"]
url = ssh://example.com/srv/git/repo.git
push = refs/heads/public:refs/heads/public
この例がお役に立てば幸いです。ただし、ドキュメントを読み、盲目的に使用しないでください。
「有料サービスの一部」に関するコードが、パブリック リポジトリにプッシュされた「オープンソース Rails アプリ」を表すコードとは別の (つまり、「別のディレクトリにある」) 場合、次のことができます。
そうすれば、すべてのシステム (パブリック Rails アプリ + プライベート ペイ システム) で作業しますが、パブリック部分のみを GitHub にプッシュし、すべてのシステム (プライベート + パブリック) を別のプライベート リポジトリ (バックアップ マシン上) にプッシュできます。例えば)。
プライベート コードがパブリック コードと混在している場合は、Talljoe の回答またはJakub Narębski の回答を参照してください。