2011-02-04 83 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即可。

我希望有帮助。