Svn 版本控制中的项目结构

Svn 版本控制中的项目结构,svn,version-control,tfs,branch,project-structure,Svn,Version Control,Tfs,Branch,Project Structure,我知道在版本控制中至少有10种不同的方法来构造项目。我很好奇正在使用的一些方法是什么,哪些方法对你有效。我曾与SVN、TFS和VSS合作过。我见过版本控制实现得很差,还可以,但从来都不是很好 为了让事情顺利进行,这里是对我所看到的事情的回顾 此示例基于SVN,但适用于大多数VCS(不适用于分布式版本控制) 分支属于站点一部分的单个项目 /分部/web/projectName/vb/src/[trunk | branchs | tags] 分支整个站点,在我看到的例子中,除了核心组件,整个站点都被

我知道在版本控制中至少有10种不同的方法来构造项目。我很好奇正在使用的一些方法是什么,哪些方法对你有效。我曾与SVN、TFS和VSS合作过。我见过版本控制实现得很差,还可以,但从来都不是很好

为了让事情顺利进行,这里是对我所看到的事情的回顾

此示例基于SVN,但适用于大多数VCS(不适用于分布式版本控制)

  • 分支属于站点一部分的单个项目 /分部/web/projectName/vb/src/[trunk | branchs | tags]

  • 分支整个站点,在我看到的例子中,除了核心组件,整个站点都被分支了。 /分部/[trunk | branchs | tags]/web/projectName/vb/src/

  • 使用主线a默认值,仅在需要进行巨大更改时才使用分支

  • SVN示例:

    树干/

    分支机构/

    标签/

    行李箱应保持在一个位置,您可以随时从中推动释放装置。应该没有你所知道的巨大的漏洞(当然最终会有,但这是你应该努力的)

    每次你需要做一个新的特性,做一个设计变更,不管怎样,分支。在开始处标记该分支。然后,当您完成分支标记时,将其标记在末尾。这有助于合并回主干

    每次需要推送释放时,标记。这样,如果出现严重错误,可以回滚到以前的版本

    这种设置使主干尽可能干净,允许您快速修复bug并将其推出,同时将大部分开发保留在分支中


    编辑:第三方内容视情况而定。如果我可以避免它,我就不会将它置于源代码控制之下。我将它保存在源代码管理之外的目录中,并从那里包含它。对于jquery之类的东西,我确实将其置于源代码控制之下。原因是它简化了我的推送脚本。我可以简单地让它做一个svn导出和rsync

    我认为团队采用的SCM策略和程序将非常依赖于他们使用的开发过程。如果你有一个50人的团队,有几个人同时进行重大更改,并且每6个月才发布一次,那么每个人都有自己的分支,在那里他可以独立工作,并且只在需要时合并来自其他人的更改,这是非常有意义的。另一方面,如果你是一个5人的团队,所有人都坐在同一个房间里,那么减少分支的频率是有意义的

    假设您在一个沟通和协作良好且发布频繁的小团队中工作,那么将IMO分支是毫无意义的。在一个项目中,我们只是将SVN修订号滚动到我们所有发布的产品版本号中,甚至从未标记。在prod中发现了一个关键bug的罕见情况下,我们只需直接从发布的修订版分支即可。但大多数时候,我们只是修复了分支中的bug,并按计划在周末从主干中发布。如果你的发布足够频繁,你几乎永远不会遇到一个不能等到下一个正式发布的bug

    我曾在其他项目中工作过,但由于轻量级开发过程和低调的仪式,我们能够非常有效地使用轻量级版本控制策略

    我还将提到,我所写的所有内容都来自企业IT上下文,其中只有给定代码库的单个生产实例。如果我正在开发一个部署在100个不同客户站点的产品,那么分支和标记实践就必须更加繁重,以便管理所有实例中的所有独立更新周期

    对于外部依赖性,比如AJAXTookit或其他一些在几个项目中使用的第三方扩展,又如何呢


    源代码管理用于源代码,而不是二进制文件。将任何第三方程序集/JAR保存在单独的存储库中。如果你在Java世界工作,试试Maven或Ivy之类的东西。对于.Net项目,一个简单的共享驱动器可以很好地工作,只要您对它的结构和更新有合适的策略。

    对于我的项目,我总是使用这种结构

    • 树干
      • 配置
      • 文件
      • sql
        • 首字母
        • 更新
      • src
        • 应用程序
        • 试验
      • 第三方
        • 解放党
        • 工具
    • 标签
    • 分支机构
    • 配置-用于存储我的应用程序配置模板。在构建过程中,根据构建的配置,我使用这些模板并用实际值替换令牌占位符
    • 文档-所有应用程序文档都放在这里
    • sql-我将sql脚本分为两个目录。一个用于初始数据库设置(当您开始刷新时),另一个用于根据数据库版本号运行的“我的更新”脚本
    • src-应用程序源文件。在这里,我根据应用程序和测试中断源文件
    • 第三方-这是我将我在应用程序中引用的第三方库放在GAC中不可用的地方。我根据lib和工具将它们分开。lib目录包含需要包含在实际应用程序中的库。tools目录包含应用程序引用的库,但仅用于运行单元测试和编译应用程序

    我的解决方案文件与我的构建文件一起放在主干目录下。

    我们使用Java进行高度组件化的开发,我们有大约2个
    svnrepo/
      trunk/
        modules/
          m1/ --> will result in jar file
          m2/
          ...
        assemblies/
          a1/
          ...
      tags/
        modules/
          m1/
            1.0.0/
            1.0.1/
            1.1.0/
           m2/
          ...
        assemblies/
          a1/
            iteration-55/
            ...
      branches/
        m1/
          1.0/
          ...
    
    + devroot
        +--Dept1
            +--Dept1Proj1
            +--Dept2Proj2
        +--Dept2
            +--Dept2Proj1
        +--Tools
            +--Purchase3rdPartyTools
            +--NLog
            +--CustomBuiltLibrary
    
    /project
        /trunk
        /tags
            /builds
                /PA
                /A
                /B
            /releases
                /AR
                /BR
                /RC
                /ST
        /branches
            /experimental
            /maintenance
                /versions
                /platforms
            /releases