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

我正在颠覆中创建我的第一个项目。到目前为止

 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"
370867 次浏览

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

你已经正确地猜到copy是要使用的操作;它可以让Subversion跟踪这些文件的历史,并且(我认为)更有效地存储它们。

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

“书”的这一部分显示了该命令通常如何使用。

使用:

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"

正如@victor hugo所指出的,“正确”的方法是使用svn copy。 但有一个警告。以这种方式创建的“标签”将不是一个真正的标签, 它将是指定修订的精确副本,但它将是不同的 修订本身。因此,如果您的构建系统以某种方式使用了svn revision (例如,将通过'svn info'获得的数字合并到 你所构建的产品),那么你将无法构建完全相同的产品 从标签(结果将有标签的修订,而不是 原始代码)。< / p >

从设计上看,在svn中没有办法创建真正合适的元标记。

@victor Hugo和@unwind是正确的,victor的解决方案是目前为止最简单的。但是要注意SVN项目中的外部因素。如果引用外部库,当标记具有外部引用的目录时,外部库的修订引用(无论是标记、HEAD还是数字)将保持不变。

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

就用这个吧:

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

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

在我的博客上查看关于SVN使用的更好的摘要:SVN的必需品SVN要领2

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

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

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”