32

我正在 Github 上发布一个开源 Rails 应用程序(可能是 MIT 许可证)。我还想维护一个项目的私有分支/分支,我们将用作付费服务的一部分。

在这种情况下组织回购的最佳方式是什么?而且,当我有应该同时进行的更新时,如何使项目保持同步?

4

2 回答 2

33

最简单的解决方案是在您的“私有”存储库中拥有私有分支,即根本不推送到公共存储库的分支。

为此,您可能需要在配置中指定要推送到公共存储库的所有分支(而不是使用 globbing 镜像 refspec +refs/*:refs/*),或者仔细推送您想要发布的分支并依赖 Git 推送匹配分支的行为(那些是存在于远程端)将“push.default”设置为当前默认值“matching”。

如果您不小心推送了您的私有分支,您可以使用“git push < remote > :refs/heads/< private-branch >”在远程存储库中删除它(除非它被配置为禁止这样做)(记住这一点:push empty远程分支的值)。您可以使用远程挂钩来防止意外推送您的私有分支,请参阅contrib/examples 中的更新偏执示例挂钩。


旁注: Junio C Hamano,git 维护者,仅将指定的一组分支推送到公共 git 存储库:'maint'、'master'、'next'、'pu'(建议的更新)和 'html'、'man'、'去做'; 他不会发布短暂的经常变化的功能分支。



示例设置:

    工作存储库---->私有存储库(裸)---->公共存储库  
    \-------- 私有 -------/ \-------- 保护 ------------/ \------- 公共 --- --/

工作存储库”是您在其中进行提交的具有工作区域的存储库,您可以在其中提取更改并解决冲突;您工作的存储库。假设它包含以下分支:'public' 可以发布到世界的更改,'private' 你不想与他人共享或仅与选定的人共享,也许还有一些功能分支,如'ticket- 234' 或 'add-frobnicator',即使选择的组也没有准备好看到。这个存储库是非裸的,因为它没有发布。

它将具有类似于以下配置的内容,用于推送到“私有”存储库。请注意,此处明确设置了“匹配分支”行为,请参阅git-pull手册页:

[remote "private"]
        url = user@example.com:/srv/private/git/repo.git
        push = +:

私有存储库”是仅对选定人员可用的公共裸存储库,例如它只能通过 SSH 获取。它只有准备好的分支,即“公共”和“私人”分支;这些分支要么在创建“私有”存储库时存在,要么从“工作”存储库显式推送(“git push private <branch> ”)。从“工作”存储库推送(传输)仅匹配的分支,即仅“公共”和“私有”分支。

“私人存储库”具有post-update或挂钩集,如果post-receive将“公共”分支推送到“公共存储库”(见下文)(好吧,它可以无条件推送)。

公共存储库”是每个人都可以使用的公共裸存储库,例如它托管在 GitHub 和/或 Gitorious 和/或 repo.or.cz 上,或者它可能通过git://使用 git-daemon 的协议提供服务。它仅包含“公共”分支,它使用updatepre-receive接受分支的 whilelist(这里只接受“公共”分支),或拒绝分支的黑名单(在此示例中推送/创建“私有”分支将被拒绝) . 推送到“私有”存储库时会自动更新。

对于您的需要,此设置可能过于复杂;在您的情况下,可能不需要“私人”存储库。在这种情况下,“工作存储库”中用于直接推送到“公共存储库”的配置如下所示:

[repository "public"]
        url = ssh://example.com/srv/git/repo.git
        push = refs/heads/public:refs/heads/public

我希望这个例子会有所帮助;但是请阅读文档,不要盲目使用。

于 2009-06-16T07:04:47.317 回答
4

如果关于“付费服务的一部分”的代码与推送到公共存储库的“开源 Rails 应用程序”的代码是分开的(即“在另一个目录中”),您可以:

  • 将公共部分定义为独立的存储库(您可以随时推送)
  • 将私有部分定义为另一个独立的存储库
  • 使用子模块将您的公共部分包含在您的私有存储库中

这样,您正在使用全系统(公共 Rails 应用程序 + 私人支付系统),但只将公共部分推送到 GitHub,您可以将全系统(私人 + 公共)推送到另一个私人存储库(在备份机器上)例如)。


如果私有代码与公共代码混合在一起......那么请参阅Talljoe 的答案Jakub Narębski 的答案

于 2009-06-16T07:05:04.383 回答