无论如何你使用svn标签目录是什么?

时间:2009-06-02 20:13:13

标签: svn version-control organization

好的,所以我们都知道

的标准SVN设置
trunk\
branches\
tags\

我意识到建议标签应该有“特殊”提交。我从来没有真正使用过标签目录,但我不知道为什么会这样。

我的理解是标签\会包含诸如“Version1Release \,Version2Release \,ThatTimeWeUpgradedEverthing \”之类的内容等等。但是,如果您要进入并且需要对Version1Release进行更改那么它应该是一个分支,如果标签应该永远不变,那么在源控制中制作副本的意义何在?只需做一个注释,修订版712就是我们的第1版。

我想我的困惑是,似乎标签是永远不会改变的版本。但源代码控制就是保留更改文件的历史记录。我知道这是一个次要的组织论点,但我很好奇人们的想法。

9 个答案:

答案 0 :(得分:13)

  

只需做一个注释,修订版712就是我们的第1版。

对于团队中的开发人员来说这很有效(假设你有一个文档存储来制作这样的笔记),但要求任何不熟悉存储库的人“只记得”很快就会变得非常不合理。

例如,假设您的存储库可通过'net获取。用户可能会选择签出并构建一个副本,以获得他们首选但又模糊的* nix风格,并希望在添加他们不喜欢的功能之前获取一个版本的版本。标签使这种事情变得简单。

标签作为“触发点”也很出色。在我自己的存储库中,提交标记会自动启动(通过post-commit hook)一个脚本,该脚本可以构建,打包并将其发布到我们的网站。

最后,标签是便宜的副本。如果您希望以表示快照不会更改的方式“快照”您的构建,请标记它。它并不像你花了很多钱。 : - )

修改

要解决“作为分支机构实施”的想法 - 它们不是。真。事实上,Subversion根本没有实现分支或标记。这些完全是用户创建的想法,两者都碰巧使用相同的命令svn copy。但是,您使用该命令复制主干中的文件;这没什么特别的。并且对于分支或标签也没有任何固有的特殊之处。它们只是我们决定特别处理的普通目录(甚至可能通过钩子强制执行)以简化项目管理。

答案 1 :(得分:6)

  

只需做一个注释,修订版712就是我们的第1版。

对我来说,制作一个Tag 会记录rev 712是版本1.

只需查看Tags文件夹,就可以很容易地看到所有版本,里程碑,版本等。

如果您考虑标签在VSS中的工作方式,标签更快更容易使用,但完成同样的事情。只是不要过分分析它是使用copy命令制作的事实,就像分支一样。

编辑:如果您对某人提交对Tag文件夹的更改感到偏执,您可以使用预提交挂钩来阻止用户使用。

答案 2 :(得分:2)

  

只需做一个注释,修订版712就是我们的第1版。

但是在这种情况下,你必须做一个明确的记录,将该记录存放在每个人都可以看到它并寻找它的地方。

从版本712创建标记(即,从r712复制到标记目录),名称为“版本1版本”要容易得多。并且每个人都立即知道这是发布,而不必首先查找版本1发布的版本。

答案 3 :(得分:2)

subversion存储库只是一个文件和文件夹树,您可以随时在其历史记录中的任何版本中获取该树的任何部分。

正如其他人所说的那样,tag / branches / trunk只是一个常规,subversion允许你将树的一部分复制到其他地方(几乎)免费,但在它的核心,就是它。

您的版本需要维护分支,这是对的。标记作为您在外部发送的任何特定版本的名称 - 当您创建标记时,提交注释使您有机会解释它的去向和原因(例如,“公共测试版”,“请求评论”)。 / p>

有几个钩子脚本可以阻止你对标签进行修改,但默认情况下它们不会实现,因为有些人以完全不同的方式使用subversion(例如,配置文件备份等)。 Subversion是一个通用工具,没有“正确”的方式来使用它,只是常见情况下的强大约定。

事实上,collabnet正在考虑如何对non-development projects使用版本控制。标签主干和分支的整个想法可能与其中一些无关。

我在考虑源代码存储库时的惯例是:

  • Trunk - 可以发布的完整修订列表
  • 任务 - 对一组修订进行分组的作业/错误的外部描述
  • 开发分支 - 尚未为主干准备的一组修订
  • 维护分支 - 从主干收集修订版本的地方
  • 标签 - 维护分支的命名快照

标签还可以为您提供可用的文档URL,例如:

“发布时间为http://svnserver/myproject/tags/1.0” 它可能是: “该版本可在http://svnserver/myproject/trunk@4483

获取

但是当你浏览存储库时,你永远不会遇到@ 4483并且知道它在任何方面都是特殊的。

答案 4 :(得分:1)

标签应该引用一组文件的不可变“应用程序版本” (“应用程序的版本”,而不是“VCS使用的技术内部版本号”,如SVN的修订版,或Git的SHA-1,或ClearCase的id,或......) 它们应该作为引用在另一个工作区中查询和部署(用于测试或UAT - 用户验收测试 - )

由于SVN实现了像分支这样的标签:作为目录,修改标签中文件的动机可能很强,但会破坏标签的用途。其他VCS具有标签(或“基线”)的概念,一旦设定,就不能再移动。

George Mauer评论:

  

那就是我所说的。标签永远不应该被改变,因此将它们实现为分支是非常奇怪的。

“实施”?但他们没有“实施”标签的概念。 SVN本身没有“标签”。他们只是重复使用他们的分支,并说它也可以用作标签。

SVN RedBook明确指出:

  

但是等一下:这个标签创建过程不是我们用来创建分支的相同程序吗?是的,事实上,它是   在Subversion中,标签和分支之间没有区别。两者都只是通过复制创建的普通目录   就像分支一样,复制目录是“标记”的唯一原因是因为人类决定以这种方式对待它:只要没有人提交到目录,它就永远是快照。如果人们开始承诺,它就会变成一个分支。

答案 5 :(得分:1)

我们用它来标记有趣但不是版本的特定版本,例如:“投资者演示”等。

答案 6 :(得分:1)

标签不打算修改,如果你想这样做,你应该建立一个分支。

您可以从标记创建分支,这可能是您想要做的,然后将该分支的结果重新标记为不同的版本。

您不应该签出标签进行编辑。

您不会在SVN中通过分支(复制)丢失任何历史记录。这一切都联系在一起。

答案 7 :(得分:0)

每次我将项目从开发服务器升级到生产服务器时,我都会创建一个标记。这让我了解了什么代码被提升为生产的历史。如果有任何问题,我可以快速回滚到之前的生产版本。

您不希望在tags目录中签出/更改/提交任何内容。它只是一个保存代码快照的地方。

答案 8 :(得分:0)

根据我的经验,标签用于发布标记,并且您不太可能进行修改。

如果您创建“release2-0”分支,然后需要进行更改(例如修复发布后发现的错误),则它不再代表您为2.0版发布的内容。

如果您创建“release2-0”标签并发现需要修补该版本,则可以创建一个新分支,在那里进行修复,并将其标记为“release-2-0-1”。 / p>

通过这种方式,您可以轻松访问任何版本。