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

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

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

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

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

如果您偶然推送您的私有分支,您可以使用“git push < remote >:refs / heads / < private-branch >”将其删除在远程存储库中(除非它被配置为禁止此)(要记住这一点:push empty远程分支的价值)。 您可以使用远程端的钩子防止意外推送您的私有分支,请参阅contrib / examples中的例如update-paranoid示例钩子。


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



示例设置:

     working repository ----> private repository(bare)----> public repository  
     \ ------私人------- / \ -------保护------------ / \ -------公共--- -  /

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

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

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

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

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

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

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

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

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

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

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

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


如果私人代码与公共代码混合……那么请参阅Talljoe的回答或JakubNarębski的回答 。