在Subversion中,标签和分支实际上就是目录。关于它们的概念并没有嵌入到Subversion中,而是存在于你的脑海中。
正如其他人所说,标签是仓库在某个时间点的快照,不应该更改。如果你计划更改标签,那么它应该是一个分支。
例如,
- 我想要一个显示批准更改的标签:将其作为分支而不是标签。
- 我想要显示最后一次构建使用的文件:同上。
- 我想要显示已经审核过的代码:同上。
但这些不是分支! 你 抱怨 声称。
好吧,仓库的建议结构只是建议。你可以在trunk
、tags
和branches
以外再添加另一个目录来存放这些可移动的标签:
$repo/trunk
$repo/branches
$repo/tags
$repo/moveable_tags
现在,你可以把你更改的标签放在
moveable_tags下面,而人们用于发布、快照等的标签则放在
tags下面。
我曾经在一家公司修改过建议的存储库布局。我想从存储库中删除过时的分支和标签,但是管理层和开发人员反对。
我说,
删除这些并不意味着将它们从存储库中删除。如果需要,我可以轻松地找回它们,但是通过移除它们,我可以消除这两个目录中许多不必要的混乱。然而,开发人员并不感到安全。当然,我可以找到它们,但是他们能吗?
相反,我在
trunk
、
tags
和
branches
目录级别上添加了一个
obsolete/tags
和一个
obsolete/branches
目录。我只是将过时的标签和分支移动了,而不是删除它们。
tags
和
branches
没有杂乱无章,管理者和开发人员也更放心,因为他们知道如果需要这些过时的分支和标签,去哪里找。
假设您没有使用标记进行任何复杂操作。您使用标记作为快照,而您希望更改和更新的内容是分支。但是,有时可能需要更改标记。
此外,Subversion在处理此类问题时比大多数其他版本控制系统更好。这是因为标记包含其创建和更改的整个历史记录。在大多数其他版本控制系统中,如果有的话,该标记的历史记录是第二流公民。您可以看到标记。您可以看到哪些文件和版本位于该标记下,但是无法查看谁创建了该标记以及它如何更改。在Subversion下,标记包含它们的整个历史。
要更改标记,请执行以下操作:
或者,更好的方法是使用
svn cp
、
svn mv
或
svn delete
针对存储库URL而不是针对工作目录。例如,我创建了一个发布2.0的标记。突然间,我们意识到我们忘记了一个非常重要的更改,需要随同这个发布一起出去。您可以这样做:
$ svn cp -r 23933 -m"This change in this file should have been included in the tag" \
$repo/trunk/foo/src/foo.java $repo/tags/2.0/foo/src/foo.java
当你查看这个标签的历史时,现在你会看到。
$svn log -v $repo/tags/2.0
------------------------------------------------------------------------
r23945 | david | 2013-04-03 11:21:55 -0400 (Wed, 3 Apr 2013) | xxx lines
Changed paths:
M /tags/2.0/foo/src/foo.java (from /trunk/foo/src/foo.java:23933)
This change in this file should have been included in the tag
------------------------------------------------------------------------
r23932 | david | 2013-04-10 11:18:40 -0400 (Wed, 10 Apr 2013) | 1 line
Changed paths:
A /tags/2.0 (from /trunk:23921)
Created release 2.0
我看到这个标签是从主干的修订版本23921一周前创建的。然后我看到文件foo.java
是一周后从主干的修订版本23933更新的。