来自Git新手的问题:我在Git存储库中有一个项目,其中一部分我想作为OSS提供。出于实际原因,项目的私有和公共部分的存储库必须是不同的,而所有开发都将在私有存储库中进行。在某些时间点,我想使用私有版本中的选定提交更新OSS版本。
现在,我在公共仓库的本地镜像中有一个私有仓库设置的远程分支,我正在使用git cherry-pick
将有趣的提交从私有仓库的远程分支复制到主分支。公共回购,然后我推。然而,由于私人开发进展非常快,樱桃采摘可能非常耗时。
有关如何使工作流程更好的建议吗?
答案 0 :(得分:8)
一种可能的选择是使用git rebase -i
为您提供私有中特定范围内所有提交的文本文件。假设您private
和public
在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替换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
所以你有两个遥控器,public
和private
。您将work
和master
推送到private
,但只将master
推送到public
。
我希望有所帮助。
答案 2 :(得分:1)
我可以想到一种方式。您可以创建主项目的公共存储库submodules,然后单独开发它们,但同时在主项目中使用它们。
但是,我认为您应该为主要和公共组件创建单独的存储库,并为后者单独安装后者创建后者。