我正在Subversion中创建我的第一个项目。到目前为止
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"
As noted by @victor hugo, the "proper" way is to use svn copy.
There is one caveat though. The "tag" created that way will not be a true tag,
it will be an exact copy of the specified revision, but it will be a different
revision itself. So if your build system makes use of svn revision somehow
(e.g. incorporates the number obtained with 'svn info' into the version of
the product you build), then you won't be able to build exactly the same product
from a tag (the result will have the revision of the tag instead of that of the
original code).
从设计上看,在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
我最近开始认为这是最“正确”的标记方式。这样你就不会创建额外的修订(就像你在"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;
}'
此外,如果需要的话,您可以通过这种方式无缝地删除标签。所以标签就变成了一个完整的元信息,我喜欢这样。