我正在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"

当前回答

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中没有办法创建真正合适的元标记。

其他回答

就用这个吧:

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

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

在我的博客:SVN Essentials和SVN Essentials 2中查看SVN使用情况的更好摘要

试试这个。这对我来说很管用:

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"

可以用乌龟:

http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-branchtag.html

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"

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

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