2011-02-04 17 views
10

Git初心者からの質問:私はGitリポジトリにプロジェクトを持っていますが、その一部をOSSとして利用したいと考えています。実用的な理由から、プロジェクトの私的部分と公共部分のリポジトリは異なる必要がありますが、すべての開発は私的リポジトリで行われます。特定の時点で、プライベートバージョンから選択されたコミットでOSSバージョンを更新したいと思います。同じプロジェクトのGit privateとpublic repos

私はプライベートレポのリモートブランチをパブリックレポのローカルミラーに持っています。私はgit cherry-pickを使ってプライベートレポのリモートブランチから興味深いコミットをパブリックレポのマスターブランチにコピーしています私はそれを押します。しかし、私的開発は非常に速く動いているので、チェリーピッキングは非常に時間がかかることがあります。

ワークフローを少し改善する方法についての提案はありますか?

ところで、私は質問#999064#1807036

答えて

5

可能な選択肢の1つは、git rebase -iを使用して、プライベートの特定の範囲にあるすべてのコミットのテキストファイルを提供することです。あなたはprivatepublicヘッド言うとprivate支店に10回の新しいコミットをして:

git checkout private 
git pull 
git checkout -b work 
git rebase -i --onto public private^10 
# an editor pops up listing the commits. Just delete the private ones. 
git checkout public 
git merge work 
git branch -d work 
git push 

あなたは上記に加えて、このようなlastsyncブランチを維持する場合は、回転を追跡する必要がlastsyncで10 ^私的に取って代わることができず、カウント:

git checkout lastsync 
git merge private 
+0

これは私が探していたものです、ありがとう! –

1

SO読みになりました私は1つの方法を考えることができます。メインプロジェクトの公開リポジトリsubmodulesを作成し、それを別々に開発することもできますが、同時にメインプロジェクトからそれらを使用することもできます。

しかし、私はあなたが本当にメインとパブリックコンポーネントのための別のリポジトリを作成し、別々にインストールされている前者の後者の依存関係を作るべきだと思います。

+0

回答ありがとうございます。以前はサブモジュールを検討していましたが、プロジェクトの編成方法は非常に限定的です。私は主にプライベートレポのコミットの収集を自動化し、それを公開して1つに適用する方法を探しています。 –

+0

Mmm。それは面白いね。私は、そのようなワークフローが持つ他のユースケースを考えています。 –

2

私が提案しようとしているのはおそらく#999064の回答に似ていますが、私はそれを行っていきます。

基本的には、2つのブランチを使用することです。 masterはあなたのすべての公共事業が入り込む主要な支店です。 workは私設支店です。だからあなたは、あなたが変更を公に利用できるようにしたいときはいつでも、あなたはmasterのコミットを行います。コミットがプライベートである場合は、workブランチ上に作成します。

トリックは、masterworkに戻してマージすることです。この方法でworkはすべてmasterという変更を行いますが、masterにはmasterで行われたコミットのみが含まれます。

だから何あなたが得ることである:

-- work --------- c -- e ------- h 
       /   /
-- master -- a -- b -- d -- f -- g 

masterはコミット、B、D、F、Gが含まれています。 workには、マージコミットc(a、bを含む)、h(d、f、gを含む)、および通常のコミットeが含まれています。

eはworkブランチにのみあり、他のすべてのコミット(マージコミットを除く)は両方のブランチにあります。

上のグラフを生成する方法については、例:

# on branch master 
# changes for a 
git add . 
git commit -m 'commit a' 

# changes for b 
git add . 
git commit -m 'commit b' 

# switch to work 
# merge a and b (from master) into work, producing merge commit c 
git checkout work 
git merge master 

# switch to master 
# make commits d, f and g 
git checkout master 
... 

# switch to work 
# make commit e 
# merge d, f and g (from master) into work, producing merge commit h 
git checkout work 
git merge master 

だからあなたが2つのリモコン、publicprivateを持っています。 workmasterprivateにプッシュしますが、masterpublicにプッシュするだけです。

私は役立つことを願っています。

関連する問題