我在Subversion创建了我的第一个项目 . 到目前为止我有
branches
tags
trunk
我想我立即需要使分支单数并重新开始 . Update branches 是常态 .
我一直在干线工作,并将内容移动到标签如下 .
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"
9 回答
使用:
速记:
你是正确的,因为将文件添加到tags文件夹并不“正确” .
你已经正确地猜到
copy
是要使用的操作;它让Subversion跟踪这些文件的历史记录,并且(我假设)更有效地存储它们 .根据我的经验,最好对整个项目进行复制(“快照”),即根签出位置的所有文件 . 这样,快照可以独立存在,作为整个项目在特定时间点的状态的真实表示 .
This part of "the book"显示了命令通常如何使用 .
正如@victor hugo所说,“正确”的方式是使用svn copy . 但有一点需要注意 . 以这种方式创建的“标签”将不是真正的标签,它将是指定修订版的精确副本,但它本身将是一个不同的版本 . 因此,如果您的构建系统以某种方式使用svn修订版(例如将使用'svn info'获得的编号合并到您构建的产品的版本中),那么您将无法从标记构建完全相同的产品(结果将具有标记的修订而不是原始代码的修订 .
它看起来像设计在svn中没有办法创建一个真正合适的元标记 .
可以使用乌龟:
http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-branchtag.html
只要用这个:
(当然,所有这一切都在一行 . )你应该总是创建整个trunk文件夹和内容的分支 . 当然可以分支主干的子部分,但这几乎不是一个好习惯 . 您希望分支的行为与现在的主干完全相同,为此,您必须分支整个主干 .
在我的博客上查看有关SVN用法的更好摘要:SVN Essentials和SVN Essentials 2
@victor hugo和@unwind是正确的,而victor的解决方案是迄今为止最简单的解决方案 . 但请注意您的SVN项目中的外部因素 . 如果引用外部库,则在标记具有外部引用的目录时,外部的修订引用(无论是标记,HEAD还是数字)将保持不变 .
可以创建一个脚本来处理标记的这一方面,有关该主题的讨论,请参阅此SO文章:Tagging an SVN checkout with externals
标记Subversion存储库的另一个选项是将标记添加到svn:log属性,如下所示:
我最近开始认为这是最“正确”的标记方式 . 这样您就不会创建额外的修订(就像使用“svn cp”一样),并且仍然可以通过在“svn log”输出上使用grep轻松提取所有标记:
此外,这样您可以根据需要无缝删除标签 . 因此标签成为完整的元信息,我喜欢它 .
您只需更改URL路径即可 . 此命令将创建新的目录"tagDestination" . 如果发生任何错误,第二行将告诉您完整的错误详细信息 . 如果没有创建,请创建svn env variable . 可以检查(Cmd: - set,Powershell: - Get-ChildItem Env :)默认路径是"C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe"
试试这个 . 这个对我有用: