如何从trunk中正确创build一个SVN标签?

我在Subversion中创build了我的第一个项目。 到目前为止,我有

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保持一些文件之间的关系。 我以这种方式创build的文件彼此没有任何关系,我相信我会错过Subversion的function。 我对么?

我应该使用svn副本的个人文件?

 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" 

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

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

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

“这本书”的这一部分显示了这个命令是如何使用的。

只是做

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

正如@维克托·胡戈指出的那样,“正确”的方法是使用svn copy。 有一个警告,但。 以这种方式创build的“标签”不是真正的标签,它将是指定版本的精确副本,但它本身将是一个不同的版本。 因此,如果你的构build系统以某种方式使用svn修订版本(例如,将通过'svn info'获得的编号合并到你构build的产品版本中),那么你将无法从标签中构build完全相同的产品结果会有标签的修改,而不是原来的代码)。

它看起来像devise在svn没有办法创build一个真正适当的元标记。

只需使用这个:

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

(当然,所有这一切都在一行上。)你应该总是做一个整个中继文件夹和内容的分支。 当然可以分支躯干的子部分,但这几乎不会是一个好的做法。 你希望分支行为与现在的分支一模一样,为了实现这一点,你必须分支整个分支。

在我的博客中查看更好的SVN使用总结: SVN Essentials和SVN Essentials 2

@维多利亚hugo和@unwind是正确的,胜利者的解决scheme是迄今为止最简单的。 但是请注意SVN项目中的外部信息。 如果引用外部库,那么在标记具有外部引用的目录时,外部的修订引用(标记,HEAD或数字)将保持不变。

有可能创build一个脚本来处理标记的这个方面,关于这个主题的讨论,请参阅这篇文章: 用外部标记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 

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

而且,这样你可以无缝地删除标签,如果你需要的话。 所以标签成为一个完整的元信息,我喜欢它。

尝试这个。 这个对我有用:

 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"