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

 branches
 tags
 trunk

我认为我需要马上把分支变成单数,然后重新开始。更新分支是常态。

我一直在trunk中工作,并将内容移动到tag,如下所示。

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"

当前回答

标记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;
                  }'

此外,如果需要的话,您可以通过这种方式无缝地删除标签。所以标签就变成了一个完整的元信息,我喜欢这样。

其他回答

Use:

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"

As noted by @victor hugo, the "proper" way is to use svn copy. There is one caveat though. The "tag" created that way will not be a true tag, it will be an exact copy of the specified revision, but it will be a different revision itself. So if your build system makes use of svn revision somehow (e.g. incorporates the number obtained with 'svn info' into the version of the product you build), then you won't be able to build exactly the same product from a tag (the result will have the revision of the tag instead of that of the original code).

从设计上看,在svn中没有办法创建真正合适的元标记。

你是正确的,在标签文件夹中添加文件是不“正确的”。

您已经正确地猜到复制是要使用的操作;它可以让Subversion跟踪这些文件的历史,并且(我认为)更有效地存储它们。

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

这本书的这一部分展示了这个命令通常是如何使用的。

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

可以创建一个脚本来处理标记的这一方面,关于该主题的讨论,请参阅这篇SO文章:用外部标记SVN签出

标记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;
                  }'

此外,如果需要的话,您可以通过这种方式无缝地删除标签。所以标签就变成了一个完整的元信息,我喜欢这样。