Git私人和公共回购同一个项目

时间:2011-02-04 08:50:19

标签: git

来自Git新手的问题:我在Git存储库中有一个项目,其中一部分我想作为OSS提供。出于实际原因,项目的私有和公共部分的存储库必须是不同的,而所有开发都将在私有存储库中进行。在某些时间点,我想使用私有版本中的选定提交更新OSS版本。

现在,我在公共仓库的本地镜像中有一个私有仓库设置的远程分支,我正在使用git cherry-pick将有趣的提交从私有仓库的远程分支复制到主分支。公共回购,然后我推。然而,由于私人开发进展非常快,樱桃采摘可能非常耗时。

有关如何使工作流程更好的建议吗?

BTW,我确实阅读了SO问题#999064#1807036

3 个答案:

答案 0 :(得分:8)

一种可能的选择是使用git rebase -i为您提供私有中特定范围内所有提交的文本文件。假设您privatepublicprivate分支中有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替换private ^ 10,而不必跟踪转数:

git checkout lastsync
git merge private

答案 1 :(得分:3)

虽然我要提出的建议可能类似于#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。

仅在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

我希望有所帮助。

答案 2 :(得分:1)

我可以想到一种方式。您可以创建主项目的公共存储库submodules,然后单独开发它们,但同时在主项目中使用它们。

但是,我认为您应该为主要和公共组件创建单独的存储库,并为后者单独安装后者创建后者。