代码之家  ›  专栏  ›  技术社区  ›  Data Monk

版本控制:管理公共组件源

  •  2
  • Data Monk  · 技术社区  · 15 年前

    如何管理DVC中的公共库源?

    目前,我的团队使用Performance来管理我们的软件项目。使用Perforce的“工作区映射”功能,我能够轻松地将公共库源映射到dev应用程序目录,从而保持源管理和dev项目工作之间的转换透明。例如,存储库如下所示:


    SCM树结构

      • 应用程序
        • 福田
        • 管理工具
      • 常见的
        • 事件记录器
        • json.parser分析程序
      • 分贝
        • 用户
        • 站点配置

    由于漂亮的P4映射特性,我们的开发人员可以为他们工作的项目提取一套完整的源代码,这些源代码的形式使用工作区映射最有意义。典型的dev项目文件夹可能如下所示:


    开发项目文件夹

    /projects
        /FALL-2009
            /ForumSite
                /deps
                    /event.logger
                    /json.parser
            /AdminTool
                /deps
                    /event.logger
                    /json.parser
            /Users-db
            /SiteConfiguration-db
        /FALL-2009-PATCH-01
            /json.parser
            /SiteConfiguration-db
        /FALL-2009-PATCH-02
            /AdminTool
                /deps
                    /event.logger
                    /json.parser
            /SiteConfiguration-db
    

    当开发人员编辑他/她的任何组件或应用程序中的源代码时,更改将被映射回位于正确版本点的正确源代码管理目录。这对开发人员来说是透明的,减少了管理的复杂性和建立新项目的时间。

    我正在研究Git、Bazaar和Mercurial作为性能的潜在替代品。任何人都能洞察在dvcs世界中如何处理常见的组件源代码吗?

    4 回复  |  直到 15 年前
        1
  •  6
  •   Brian Campbell Dennis Williamson    15 年前

    在Git中,您将使用 git submodule 为此目的。

    Git子模块存储为对来自另一个存储库的修订的引用,以及一个提供URL以查找另一个存储库的文件。当你执行 git submodule update ,Git将克隆被引用存储库的副本(或者您可以将其配置为指向同一存储库的不同副本(位于不同的URL),因为它是一个dvc,因此包含被引用版本的存储库的任何克隆都将起作用),然后签出被引用的版本。

    可悲的是,它并不像人们希望的那样无缝。在父存储库中签出一个新的修订版实际上并不签出子模块;您需要做一个显式的 Git子模块更新 为了完成这一点。我们试过包装 git pull; git submodule update 作为一个命令,但是有很多其他命令(例如 git rebase )这涉及到签出文件,这些文件可能会使您陷入混乱状态,因为它们也不会更新子模块。一旦你熟悉了子模块是如何工作的,它将全部工作,但它提供了一些摩擦。

        2
  •  4
  •   Community CDub    8 年前

    两天前,一个非常类似的问题以反复无常的方式被问到:

    How do people manage changes to common library files stored across mutiple (Mercurial) repositories?

    Subrepo支持,现在在Mercurial中得到了很好的支持,似乎是您设置的最佳选择。

        3
  •  2
  •   bialix    15 年前

    在集市上我用的是插件 scmproj 它允许我指定所需的组件配置,这样我就可以在实际分支和它们在本地磁盘上的集合之间提供任何映射,如您所描述的。

        4
  •  1
  •   moritz    15 年前

    我们使用的是Git,对它的子模块特性非常满意。它让您将其他Git存储库集成到当前的存储库中,当然,还有修订版。我能看到什么,它工作得很好——)