如何保持git repo的公共和私有版本同步?

时间:2009-06-16 00:05:46

标签: ruby-on-rails git github

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

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

2 个答案:

答案 0 :(得分:31)

最简单的解决方案是在“私有”存储库中使用私有分支,即只将 未推送 的分支到公共存储库。

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

如果你偶然推送你的私人分支,你可以使用“git push< remote >删除它在远程存储库中(除非它被配置为禁止这个):refs / heads /&lt ; 私人分支>”中(要记住这一点:将空值推送到远程分支)。您可以使用远程侧的挂钩防止意外推送您的专用分支,例如,在contrib / examples中的update-paranoid示例挂钩。


旁注: Junio C Hamano,git维护者,推送公共git存储库只指定一组分支:'maint','master','next','pu'(建议更新),和'html','man','todo';他没有发表短暂的,经常变化的特征分支。



示例设置:

    working repository  ---->  private repository (bare)  ---->  public repository  
    \------ private -------/     \------- protected ------------/     \------- public -----/

工作存储库 ”是您提交工作区域的存储库,您可以在其中提取更改并解决冲突;您在哪里工作。假设它包含以下分支:“公共”包含可以发布到世界的更改,“私有”,您希望不与他人共享或仅与选定的人员共享,也许某些功能分支如“票证 - 234'或'add-frobnicator',即使对于选定的组也看不到。这个存储库是非裸的,因为它没有发布。

它将具有类似于以下配置的推送到“私有”存储库。请注意,“匹配分支”行为在此处设置为 explicitely ,请参阅git-pull联机帮助页:

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

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

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

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

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

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

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

答案 1 :(得分:3)

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

  • 将公共部分定义为独立的存储库(您可以随时按下)
  • 将私有部分定义为另一个独立的存储库
  • 使用submodules将您的公共部分包含在您的私人存储库中

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


如果私人代码与公开代码混合...,请参阅Talljoe's answerJakub Narębski's answer