如何在SVN中移动标签

YoY*_*oYo 6 svn tortoisesvn

这个问题可以改为:

如何将特定文件的主干中的单个更改包含到现有TAG中.

一个简单的问题,但我自己无法解决这个问题.

这个概念来自其他SCM工具,您可以在不同的修订版上移动标记,并将其"粘贴"到您需要的确切修订版本.这些其他工具对Tag的内容有本地的理解,SVN将所有内容概括为副本分支.

我在其他公告板和帖子上看到的答案如下,因此已被考虑和拒绝:

  1. 这不是SVN的正确使用
    • 实际上,SVN被设计为通用的,并且完成了许多使用模式
    • 这是寻找答案的使命.我理解挑战,以及永远找不到答案的可能性.也许我会改用不同的工具.
  2. 为什么你这样使用SVN,最好这样做.
    • 可以采用许多使用模式或SCM模型.在我的情况下具体:
      • Trunk表示正在进行的开发,并且应用了小补丁.
      • 生产是单一的TAG
      • 从开发转向非常短暂和积极,因此我们不能使用几个完整的生产版本.这意味着我不能每次都为生产中部署的每个小变更创建一个新标签.
      • 简而言之,"我的方案中不存在完整的打包生产版本".
    • 这是我需要的用例场景.

好吧,我不会放肆,我会阅读所提供的每一个解决方案,并根据需要重新考虑.

Dav*_* W. 5

Subversion 中的标签和分支实际上只是目录。它们是什么的概念并未嵌入 Subversion,而是嵌入您的大脑。

正如其他人所说,标签是您存储库在某个时间点的快照,不应更改。如果你打算改变一个标签,它真的应该是一个分支。

例如,

  • 我想要一个显示已批准更改的标签:使它成为一个分支而不是一个标签。
  • 我想展示上次构建使用了哪些文件:同上。
  • 我想展示哪些代码已经过审核:同上。

但这些不是分支!发牢骚

很好,存储库的建议结构就是:一个建议。除了trunk, tags, 和branches这些可移动标签之外,您还可以添加另一个目录:

$repo/trunk
$repo/branches
$repo/tags
$repo/moveable_tags
Run Code Online (Sandbox Code Playgroud)

现在,您可以将更改的标签放在moveable_tags下,将人们用于发布、快照等的标签放在tags下。

我之前在我工作的一个位置修改了建议的存储库布局。我想从存储库中删除过时的分支和标签,但管理层和开发人员反对。

我说删除这些并不是从存储库中删除它。如果需要,我可以轻松地将它们取回,但是通过删除它们,我从这两个目录中消除了许多不必要的混乱。但是,开发人员对此并不感到安全。当然,我可以找到它们,但是它们可以吗?

相反,我添加了一个obsolete/tagsobsolete/branches目录的trunktagsbranches目录级别。我没有删除过时的标签和分支,而是移动了它们。tags并且branches没有杂乱,管理人员和开发人员感觉更好,因为他们知道如果需要的话可以找到这些过时的分支和标签。


假设您没有对标签做任何花哨的事情。您将标签用作快照,并且您希望更改和更新的任何内容都是一个分支。有时可能需要更改标签。

而且,Subversion 比大多数其他版本控制系统更擅长处理这个问题。这是因为标签包含其创建和更改的整个历史。在大多数其他版本控制系统中,该标签的历史记录即使保留下来也是二等公民。你可以看到标签。您可以看到该标签下的文件和版本,但您看不到该标签的创建者和更改方式。在 Subversion 下,标签包含它们的整个历史。

要对标签进行更改:

  • 检查标签。
  • 做出改变。
  • 提交您的更改。

或者,更好的是,针对存储库 URL使用svn cpsvn mvsvn delete,而不是针对工作目录。例如,我为 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
Run Code Online (Sandbox Code Playgroud)

当您查看此标签的历史记录时,您现在将看到。

 $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
Run Code Online (Sandbox Code Playgroud)

我看到标签是一周前从主干上的修订版 23921 创建的。然后我看到该文件foo.java在一周后从主干上的修订版 23933 更新。


Ale*_*nov 4

标签和分支在 SVN 中没有区别。所有的区别在于团队遵循的关于如何使用标签和分支的策略。

因此,您可以将更改合并到标签中并提交新修订,就像使用分支一样。可以理解的是,通常您不想这样做,以便“标记”用于发布的文件的确切版本。但如果确实需要,您可以破例一次。

或者,您可以删除标签,然后使用正确的修订版重新创建它。

SVN 书籍的几个链接:“ Tags ”、“ Branch Maintenance


补充:所以,听起来这种重新标记并不是一个罕见的、非典型的用例,而是您团队中的常规做法。似乎使用标签,您不仅为文件的特定快照命名,而且希望该名称跟随文件的后续更新,而忘记其以前的位置。另外,您似乎发现分支对您的工作流程不方便。

好吧,我认为没有一种简单干净的方法可以用 SVN 实现你想要的东西。在我看来,最好“拥抱”分支并学习如何有效地使用它们。