如何从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"