SVN:为旧修订创建文件夹

SVN:为旧修订创建文件夹,svn,versioning,Svn,Versioning,我是修订控制系统的初学者,请原谅 我的项目由两个较小的应用程序组成,它们都位于各自的SVN存储库中。此外,我在这些应用程序之间共享了一个存储库(svn:externals) 当发布新版本时,我想为该版本创建一个文件夹(包括源、文档等)。单个应用程序的存储库应如下所示: .UI . "old versions" . 1.0 . 2.0 . 2.5 . trunk (current development version 3.0) 因

我是修订控制系统的初学者,请原谅

我的项目由两个较小的应用程序组成,它们都位于各自的SVN存储库中。此外,我在这些应用程序之间共享了一个存储库(svn:externals)

当发布新版本时,我想为该版本创建一个文件夹(包括源、文档等)。单个应用程序的存储库应如下所示:

.UI
    . "old versions"
        . 1.0
        . 2.0
        . 2.5
    . trunk (current development version 3.0)
因此,我的问题是:

  • 这种结构(在SVN中)的正确名称是什么
  • 我怎样才能创造它
  • 是否可以冻结这些旧版本(防止更改该文件夹)
  • 有没有更好的方法来实现这一点
  • “标记”是此文件夹的标准和正确名称
  • “svn副本”是您创建它的朋友。许多持续集成产品将有一个选项来自动标记构建
  • 是的,您可以使用“预提交挂钩”冻结它们(请参见下文)
  • 这是做事的标准方式。如果你偏离太远,你会混淆其他用户

  • 我们在这里使用的一个示例pre-comit挂钩(适用于windows):

    @echo off
    SET SVNLOOK=C:\Program Files\CollabNet Subversion Server\svnlook.exe
    SET GREP=D:\SVN\REPO\hooks\grep.exe
    
    REM Prevent changes to tags.
    ("%svnlook%" changed -t %2 %1 | "%grep%" "^U.*/tags/") && (echo Cannot commit an update to a tag.>&2 && exit 1)
    
    REM Prevent commits without comments.
    ("%svnlook%" log -t %2 %1 | "%grep%" "[a-zA-Z0-9]") || (echo You must specify a comment for all actions.>&2 && exit 1)
    
    exit 0
    

    要手动创建标记,请使用如下命令:

    svn copy "http://your/repo/UI/trunk"  "http://your/repo/UI/tags/v3.0" -m "Tagging v3.0"
    
  • 分支、标签和主干
  • 在签出中创建文件夹,然后提交它们,然后使用cmd行svn的“branch/tag”(tortoiseSVN)或“svn copy”创建主干的标记
  • 您可以在某个特定点(例如v1、v2、v3)标记主干-这会记录您当前的存储库,您可以随时返回到它们
  • 这是实现这一目标的途径
  • 分支用于不应该在主干上进行的主要更改(如果您与一组开发人员一起工作)。创建一个分支,每天将主干合并到分支上,以避免以后发生合并冲突。然后,当完成分支上的主要更改后,您将合并回主干


    当您准备发布时,您将为整个主干创建一个标记。然后从那里释放。如果将来你想回到某个版本,那么你的标签中就有这个历史参考。标签只是在某个时间点指向您的存储库,例如,当您的主干处于rev 35335时为rev 25123。

    您应该在上浏览Subversion online reference的前几章。这将使您在版本控制和Subversion方面有一个快速而良好的开端

    你所做的与颠覆的工作方式非常接近。你有那些目录了吗

    在标准的Subversion设置中,您可以设置“tags”、“branchs”和“trunk”目录。有些人将它们设置在他们存储库的根目录下,另一些人将它们设置在每个项目的根目录下

    例如:

    svn://svn/trunk/proj1
    svn://svn/trunk/proj2
    svn://svn/branches/proj1/1.2
    svn://svn/branches/proj2/3.4
    

    我见过的大多数网站都是最后一种方式,但第一种方式也有好处(主要是因为使用了
    svn:externals
    ,而且当你签出时,默认情况下你的签出不是
    trunk

    您只需调用“旧版本”目录
    标记
    ,即可完成以下操作:

    svn://svn/UI/tags/1.0
    svn://svn/UI/tags/2.0
    svn://svn/UI/tags/2.5
    svn://svn/UI/trunk
    
    如果你忘了做标签,不要惊慌!Subversion的一大优点是存储库的修订号。这有点像每次提交时都做一个标记。如果在发布时(通常通过查看
    svn日志
    )可以找到修订号,则可以复制该修订以创建标记:

    $ svn cp -r1234 svn://svn/UI/trunk  svn://svn/UI/tags/2.0
    

    如您所见,您可以使用
    svncp
    命令来创建标记和分支。顺便说一句,在没有意识到的情况下修改标记是非常容易的。在大多数站点中,它们都有一个预提交钩子,该钩子可以阻止大多数用户在标记目录下进行提交(这意味着您必须创建标记),或者允许用户创建标记(通过
    svn cp
    ),但不允许用户在创建标记后修改标记。如果您想看一看,我有一个Perl版本的预提交钩子。

    很好的预提交脚本!我可能不得不使用它,总有人不发表评论@如果这对你有帮助,请投票和/或接受答案。:)@马丁:您必须为windows获取一份
    grep.exe
    ,或者修改脚本以使用
    find.exe
    。不过,你可以随意打断它。谢谢你的回复。我正在使用VisualSVN,它会自动创建那些特定的文件夹。遗憾的是,我太愚蠢了,无法理解他们的意思/读了医生的答案。:)
    $ svn cp -r1234 svn://svn/UI/trunk  svn://svn/UI/tags/2.0