2011-02-04 81 views
10

來自Git新手的問題:我在Git存儲庫中有一個項目,其中的某些部分我想作爲OSS提供。出於實際的原因,項目的私有和公共部分的倉庫將不得不不同,而所有的開發都將在私有倉庫中進行。在某些時候,我想用私人版本的選定提交來更新OSS版本。同一項目的Git私有和公共回購

現在,我有一個在公共回購的本地鏡像中的私人回購安裝的遠程分支,我使用git cherry-pick將有趣的提交從私人回購的遠程分支複製到公共回購的主分支,然後我推。然而,由於私人發展的速度非常快,櫻桃採摘可能非常耗時。

有沒有關於如何使工作流程更好的建議?

順便說一句,我這樣做閱讀題#999064#1807036

回答

5

一個可能的選擇是使用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 
1

我能想到的一種方式。您可以製作主項目的公共存儲庫submodules,然後單獨開發它們,但同時從主項目中使用它們。

但是,我認爲你應該真的爲主要和公共組件製作單獨的存儲庫,併爲前者單獨安裝後者依賴項。

+0

感謝您的回答。我之前已經考慮過子模塊,但是他們對如何組織項目非常嚴格。我主要是在尋找一種方法來自動收集私人回購中的提交,並在公共場合一次性應用它們。 – 2011-02-04 09:04:44

+0

嗯。聽起來很有趣。我想到了這樣的工作流可能具有的其他用例。 – 2011-02-04 13:15:49

2

雖然我即將建議可能類似於從#999064的答案,我會放棄它。

基本上你想要的是使用兩個分支。 master是您的所有公共工作所涉及的主要分支。 work是您的私人分支。所以,你所做的只是當你想要改變爲公開的時候,你可以在master上做出提交。如果提交是私有的,則在work分支上進行。

訣竅是將master連續合併回work。這樣work將具有master的所有更改,但master將只包含那些在master上進行的提交。

那麼你得到的是:

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

master包含提交的a,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 

所以你有兩個遙控器,publicprivate。您將workmaster改爲private,但您只需將master改爲public即可。

我希望有幫助。