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

ojb*_*ass 275 svn tags

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

 branches
 tags
 trunk
Run Code Online (Sandbox Code Playgroud)

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

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

mkdir tags/1.0
cp -rf trunk/* tags/1.0
svn add tags/1.0
svn commit -m " create a first tagged version"
Run Code Online (Sandbox Code Playgroud)

我的直觉告诉我这是完全错误的,我应该保持文件使用之间的某种关系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"
Run Code Online (Sandbox Code Playgroud)

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

svn copy cp -rf trunk tags/1.0
svn commit -m " create a first tagged version"
Run Code Online (Sandbox Code Playgroud)

vic*_*ugo 419

使用:

svn copy http://svn.example.com/project/trunk \
      http://svn.example.com/project/tags/1.0 -m "Release 1.0"
Run Code Online (Sandbox Code Playgroud)

速记:

cd /path/to/project
svn copy ^/trunk ^/tags/1.0 -m "Release 1.0"
Run Code Online (Sandbox Code Playgroud)

  • 我把它标记为答案.只需一个额外的说明.您可以获得主干的先前版本并"标记"它.命令:svn copy -r 123"http://svn.example.com/project/trunk""http://svn.example.com/project/tags/1.0"-m"标记,但使用旧版本( 123)." (36认同)
  • 我得到**svn:本地,非提交操作不接受日志消息或修订属性**,所以我只删除-m选项. (6认同)
  • 仅供参考,请确保您的网址与您的存储库相匹配,包括http或https. (4认同)
  • @Fractaliste to continue the command in a new line (3认同)
  • 为什么\在第一行的末尾? (2认同)
  • git 用户的另一条注释:在命令之后,它只会在服务器上创建新标签。您必须“svn update”将新标签拉到本地,以便在您的计算机中“看到”新标签。对于路径,您可以导航到相应的分支文件夹并使用“svn info”来获取它。 (2认同)

unw*_*ind 183

你是正确的,因为将文件添加到tags文件夹并不"正确".

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

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

"本书"的这一部分显示了命令通常如何使用.

  • 这本书的1.1版本非常过时.这是一个更好的链接:http://svnbook.red-bean.com/nightly/en/svn.branchmerge.tags.html (14认同)

Ale*_*kin 14

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

它看起来像设计在svn中没有办法创建一个真正合适的元标记.

  • 可以使用"Last Changed Rev":```echo"{'svnRev':\``svn info | awk'/ Last Changed Rev:/ {print $ 4}'`\"}"> svnver.txt```` (4认同)

Agi*_*Pro 12

只要用这个:

svn  copy  http://svn.example.com/project/trunk  
           http://svn.example.com/project/branches/release-1
           -m  "branch for release 1.0"
Run Code Online (Sandbox Code Playgroud)

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

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


Gro*_*mer 10

可以使用乌龟:

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

  • 谢谢!命令行可能是正确的,但这更有用. (2认同)

MOK*_*OK9 7

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

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


Ale*_*kin 5

标记 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
Run Code Online (Sandbox Code Playgroud)

我最近开始认为这是最“正确”的标记方式。这样你就不会创建额外的修订(就像你使用“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;
                  }'
Run Code Online (Sandbox Code Playgroud)

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