我正在Subversion中创建我的第一个项目.到目前为止我有
branches
tags
trunk
Run Code Online (Sandbox Code Playgroud)
我想我立即需要使分支单数并重新开始. 更新分支是常态.
我一直在干线工作,并将内容移动到标签如下.
mkdir tags/1.0
cp -rf trunk/* tags/1.0
svn add tags/1.0
svn commit -m " create a first tagged version"
Run Code Online (Sandbox Code Playgroud)
我的直觉告诉我这是完全错误的,我应该保持文件使用之间的某种关系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"
Run Code Online (Sandbox Code Playgroud)
我应该在整个目录中使用svn copy吗?
svn copy cp -rf trunk tags/1.0
svn commit -m " create a first tagged version"
Run Code Online (Sandbox Code Playgroud)
vic*_*ugo 419
使用:
svn copy http://svn.example.com/project/trunk \
http://svn.example.com/project/tags/1.0 -m "Release 1.0"
Run Code Online (Sandbox Code Playgroud)
速记:
cd /path/to/project
svn copy ^/trunk ^/tags/1.0 -m "Release 1.0"
Run Code Online (Sandbox Code Playgroud)
Ale*_*kin 14
正如@victor hugo所说,"正确"的方式是使用svn copy.但有一点需要注意.以这种方式创建的"标签"将不是真正的标签,它将是指定修订版的精确副本,但它本身将是一个不同的版本.因此,如果您的构建系统以某种方式使用svn修订版(例如将使用'svn info'获得的编号合并到您构建的产品的版本中),那么您将无法从标记构建完全相同的产品(结果将具有标记的修订而不是原始代码的修订.
它看起来像设计在svn中没有办法创建一个真正合适的元标记.
Agi*_*Pro 12
只要用这个:
svn copy http://svn.example.com/project/trunk
http://svn.example.com/project/branches/release-1
-m "branch for release 1.0"
Run Code Online (Sandbox Code Playgroud)
(当然,所有这一切都在一行.)你应该总是创建整个trunk文件夹和内容的分支.当然可以分支主干的子部分,但这几乎不是一个好习惯.您希望分支的行为与现在的主干完全相同,为此,您必须分支整个主干.
在我的博客上查看有关SVN用法的更好摘要: SVN Essentials和SVN Essentials 2
Gro*_*mer 10
可以使用乌龟:
http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-branchtag.html
@victor hugo和@unwind是正确的,而victor的解决方案是迄今为止最简单的解决方案.但请注意您的SVN项目中的外部因素.如果引用外部库,则在标记具有外部引用的目录时,外部的修订引用(无论是标记,HEAD还是数字)将保持不变.
可以创建一个脚本来处理标记的这个方面,有关该主题的讨论,请参阅此SO文章:使用外部标记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
Run Code Online (Sandbox Code Playgroud)
我最近开始认为这是最“正确”的标记方式。这样你就不会创建额外的修订(就像你使用“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;
}'
Run Code Online (Sandbox Code Playgroud)
此外,如果需要,您可以通过这种方式无缝删除标签。所以标签变成了一个完整的元信息,我喜欢它。