如何保持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-update
或post-receive
挂钩集,如果将其推送到“公共存储库”(见下文),它会将“公共”分支推送到“公共存储库”(好吧,它可以无条件推送)。
“ 公共存储库 ”是可供所有人使用的公共裸存储库,例如它托管在GitHub和/或Gitorious和/或repo.or.cz上,或者可能通过git://
protocol使用git-daemon提供。 它只包含’public’分支,它使用update
或pre-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的回答 。