How to properly create an SVN tag from trunk?
我正在Subversion中创建我的第一个项目。 到目前为止我有
1 2 3 | branches tags trunk |
我想我立即需要使分支单数并重新开始。 更新分支是常态。
我一直在干线工作,并将内容移动到标签如下。
1 2 3 4 | 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吗?
1 2 3 4 5 6 | 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吗?
1 2 | svn copy cp -rf trunk tags/1.0 svn commit -m" create a first tagged version" |
使用:
1 2 | svn copy http://svn.example.com/project/trunk \ http://svn.example.com/project/tags/1.0 -m"Release 1.0" |
速记:
1 2 | cd /path/to/project svn copy ^/trunk ^/tags/1.0 -m"Release 1.0" |
你是正确的,因为将文件添加到tags文件夹并不"正确"。
您已经正确地猜到
根据我的经验,最好对整个项目进行复制("快照"),即根签出位置的所有文件。这样,快照可以独立存在,作为整个项目在特定时间点的状态的真实表示。
"本书"的这一部分显示了命令通常如何使用。
正如@victor hugo所说,"正确"的方式是使用svn copy。
但有一点需要注意。以这种方式创建的"标签"将不是真正的标签,
它将是指定修订版的精确副本,但它将是不同的
修订本身。因此,如果您的构建系统以某种方式使用svn修订版
(例如,将'svn info'获得的数字合并到版本中
您构建的产品),那么您将无法构建完全相同的产品
来自标签(结果将具有标签的修订而不是标签的修订
原始代码)。
它看起来像设计在svn中没有办法创建一个真正合适的元标记。
只要用这个:
1 2 3 | svn copy http://svn.example.com/project/trunk http://svn.example.com/project/branches/release-1 -m "branch for release 1.0" |
(当然,所有这一切都在一行。)你应该总是创建整个trunk文件夹和内容的分支。当然可以分支主干的子部分,但这几乎不是一个好习惯。您希望分支的行为与现在的主干完全相同,为此,您必须分支整个主干。
在我的博客上查看有关SVN用法的更好摘要:SVN Essentials和SVN Essentials 2
可以使用乌龟:
http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-branchtag.html
@victor hugo和@unwind是正确的,而victor的解决方案是迄今为止最简单的解决方案。但请注意您的SVN项目中的外部因素。如果引用外部库,则在标记具有外部引用的目录时,外部的修订引用(无论是标记,HEAD还是数字)将保持不变。
可以创建一个脚本来处理标记的这个方面,有关该主题的讨论,请参阅此SO文章:使用外部标记SVN签出
标记Subversion存储库的另一个选项是将标记添加到svn:log属性,如下所示:
1 2 3 4 | 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轻松提取所有标记:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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; }' |
此外,这样您可以根据需要无缝删除标签。因此标签成为完整的元信息,我喜欢它。
1 2 | svn copy http://URL/svn/trukSource http://URL/svn/tagDestination -m"Test tag code" $error[0].Exception | Select-object Data |
您只需更改URL路径即可。此命令将创建新的目录"tagDestination"。如果发生任何错误,第二行将告诉您完整的错误详细信息。
如果没有创建,则创建svn env变量。
可以检查(Cmd: - set,Powershell: - Get-ChildItem Env :)
默认路径为"C: Program Files TortoiseSVN bin TortoiseProc.exe"
试试这个。这个对我有用:
1 2 3 4 | 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" |