如何从trunk中正确创建SVN标签?

时间:2009-05-12 06:17:45

标签: svn tags

我正在Subversion创建我的第一个项目。到目前为止我已经

 branches
 tags
 trunk

我想我立即需要使分支单数并重新开始。 更新分支是常态。

我一直在干线工作,并将内容移动到标签,如下所示。

mkdir tags/1.0
cp -rf trunk/* tags/1.0
svn add tags/1.0
svn commit -m " create a first tagged version"

我的直觉告诉我这是完全错误的,我应该使用svn copy维护文件之间的某种关系。我以这种方式创建的文件彼此之间没有任何关系,我相信我会错过Subversion功能。我是对的吗?

我应该为单个文件使用svn copy吗?

mkdir tags/1.0
svn add tags/1.0
svn copy trunk/file1 tags/1.0
svn copy trunk/file2 tags/1.0
svn copy trunk/file3 tags/1.0
svn commit -m " create a first tagged version"

我应该在整个目录中使用svn copy吗?

svn copy cp -rf trunk tags/1.0
svn commit -m " create a first tagged version"

9 个答案:

答案 0 :(得分:413)

使用:

svn copy http://svn.example.com/project/trunk \
      http://svn.example.com/project/tags/1.0 -m "Release 1.0"

简写:

cd /path/to/project
svn copy ^/trunk ^/tags/1.0 -m "Release 1.0"

答案 1 :(得分:183)

你是正确的,因为将文件添加到tags文件夹并不“正确”。

您已经正确地猜到copy是要使用的操作;它让Subversion跟踪这些文件的历史记录,并且(我假设)更有效地存储它们。

根据我的经验,最好对整个项目进行复制(“快照”),即根签出位置的所有文件。通过这种方式,快照可以独立存在,作为整个项目在特定时间点的状态的真实表示。

This part of "the book"显示了该命令的使用方式。

答案 2 :(得分:13)

如@victor hugo所述,“正确”的方式是使用svn副本。 但有一点需要注意。以这种方式创建的“标签”将不是真正的标签, 它将是指定修订版的精确副本,但它将是不同的 修订本身。因此,如果您的构建系统以某种方式使用svn修订版 (例如,将'svn info'获得的数字合并到版本中 您构建的产品),那么您将无法构建完全相同的产品 来自标签(结果将具有标签的修订而不是标签的修订 原始代码)。

看起来在设计中,svn无法创建真正合适的元标记。

答案 3 :(得分:12)

请使用:

svn  copy  http://svn.example.com/project/trunk  
           http://svn.example.com/project/branches/release-1
           -m  "branch for release 1.0"

(当然,所有这一切都在一行。)您应该始终创建整个主干文件夹和内容的分支。当然可以分支主干的子部分,但这几乎不是一个好习惯。您希望分支的行为与主干现在完全相同,为此,您必须分支整个主干。

在我的博客上查看有关SVN使用情况的更好摘要:SVN EssentialsSVN Essentials 2

答案 4 :(得分:11)

答案 5 :(得分:7)

@victor hugo和@unwind是正确的,而victor的解决方案是迄今为止最简单的解决方案。但请注意您的SVN项目中的外部因素。如果引用外部库,则在标记具有外部引用的目录时,外部的修订引用(无论是标记,HEAD还是数字)将保持不变。

可以创建一个脚本来处理标记的这一方面,有关该主题的讨论,请参阅此SO文章:Tagging an SVN checkout with externals

答案 6 :(得分:4)

标记Subversion存储库的另一个选项是将标记添加到svn:log属性,如下所示:

   echo "TAG: your_tag_text" > newlog
   svn propget $REPO --revprop -r $tagged_revision >> newlog
   svn propset $REPO --revprop -r $tagged_revision -F newlog
   rm newlog

我最近开始认为这是最“正确”的标记方式。这样您就不会创建额外的修订(就像使用“svn cp”一样),并且仍然可以通过在“svn log”输出上使用grep轻松提取所有标记:

   svn log | awk '/----/ {
                      expect_rev=1;
                      expect_tag=0;
                  }
                  /^r[[:digit:]]+/ {
                      if(expect_rev) {
                          rev=$1;
                          expect_tag=1;
                          expect_rev=0;
                      }
                  }
                  /^TAG:/ {
                      if(expect_tag) {
                          print "Revision "rev", Tag: "$2;
                      }
                      expect_tag=0;
                  }'

此外,如果需要,您可以通过这种方式无缝删除标记。因此标签成为完整的元信息,我喜欢它。

答案 7 :(得分:0)

svn copy http://URL/svn/trukSource http://URL/svn/tagDestination -m "Test tag code" 
  $error[0].Exception | Select-object Data

所有要做的就是更改URL路径。此命令将创建新目录“ tagDestination”。如果发生任何错误,第二行将让您知道完整的错误详细信息。 如果未创建,请创建svn env变量。 可以检查(Cmd:-设置,Powershell:-Get-ChildItem Env :) 默认路径为“ C:\ Program Files \ TortoiseSVN \ bin \ TortoiseProc.exe”

答案 8 :(得分:-4)

试试这个。它对我有用:

mkdir <repos>/tags/Release1.0
svn commit <repos>/tags/Release1.0 
svn copy <repos>/trunk/* <repos>/tag/Release1.0
svn commit <repos/tags/Release1.0 -m "Tagging Release1.0"