Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
同一项目的Git私人和公共回购_Git - Fatal编程技术网

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

同一项目的Git私人和公共回购,git,Git,来自Git新手的问题:我在Git存储库中有一个项目,我想将其中的一部分作为OSS提供。出于实际原因,项目的私有部分和公共部分的存储库必须不同,而所有开发都将在私有存储库中进行。在某些时间点,我想用从私有版本中选择的提交更新OSS版本 现在,我在公共回购的本地镜像中设置了私人回购的远程分支,我正在使用git cherry pick将有趣的提交从私人回购的远程分支复制到公共回购的主分支,然后推送。然而,由于私人发展速度非常快,采摘樱桃可能非常耗时 对于如何使工作流变得更好,有什么建议吗 顺便说一句,

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

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

对于如何使工作流变得更好,有什么建议吗


顺便说一句,我读了很多问题,我能想到一种方法。您可以创建主项目的公共存储库,然后单独开发它们,但同时从主项目中使用它们


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

虽然我将要提出的建议可能与来自的答案类似,但我会尝试一下

基本上,您需要使用两个分支
master
是您所有公共工作的主要分支<代码>工作是您的私人分支。因此,您要做的是,无论何时,只要您希望更改也可供公众使用,就在
master
上进行提交。如果提交是私有的,则在
work
分支上进行提交

诀窍是将
master
连续合并回
work
。这样,
work
将拥有
master
的所有更改,但是
master
将只包含在
master
上进行的特定提交

所以你得到的是:

-- work   --------- c -- e ------- h
                   /              /
-- master -- a -- b -- d -- f -- g
master
包含提交a、b、d、f、g<代码>工作包含合并提交c(包含a、b)、h(包含d、f、g)和常规提交e

e仅在
工作
分支上,而所有其他提交(合并提交除外)都在两个分支上

如何生成上述图形的示例:

# 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
。您将
工作
主控
推送到
专用
,但您只将
主控
推送到
公用


我希望这会有所帮助。

一个可能的选择是使用
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

谢谢你的回答。我以前考虑过子模块,但它们对项目的组织方式有很大限制。我主要是在寻找一种方法来自动收集私人回购中的承诺,并在公共回购中一次性应用它们。听起来很有趣。我正在考虑这样一个工作流可能还有哪些其他用例。