让我先说我不熟悉 StarTeam,因此我可能无法完全理解您尝试重现的工作流程。
Subversion 本身并不区分标签和分支。按照惯例,标签只是一个您永远不会修改的分支。甚至一个分支也只是一个“svn 复制”操作,没有单独的“分支”功能。一个分支只是一个廉价的副本,一个标签是一个按照约定只读的分支。svn 中的副本非常便宜,因此您不必担心创建分支很多——标签并不比分支便宜。您可能想阅读有关创建分支的文档。它进一步解释了事情......并有一个关于“廉价副本”的盒装部分。
根据您在 StarTeam 中使用“查看标签”的情况,svn externals可能对您的目的有用。我一般不喜欢它们,但这取决于场景。
更直接地回答您的问题...
1)这将取决于文件中是否有其他更改。您想要一个文件中的一个修订版本的更改吗?或 1 个文件的所有更改(多个修订,仅 1 个文件)。希望你的意思是前者。在这种情况下,通常的行为是合并
假设您有以下情况:
------------------------------------> /trunk
| | fix merged to 1.0 branch
| v
\------------> /branches/1.0
| ^ |
| \ /tags/1.1 1.1 tag, fix released to customer(s)
\ /tags/1.0 - 1.0 GA tag, release sent to customer(s)
你在主干上开发。在修订版 10 中,您的产品已经准备好发布 1.0!您创建一个分支:
svn copy /path/to/trunk /path/to/branches/1.0
然后您继续在主干上进行开发,同时还在 1.0 分支上进行一些额外的验证。当它准备好发货时,您创建一个标签:
svn copy /path/to/branches/1.0 /path/to/tags/1.0
此标签是一个冻结的时间点,与您运送给客户的产品完全匹配。
您发现已经在主干上完成的 1.0 版本客户所需的错误/功能/更新。在您的情况下,您已经声明了对特定文件的更改。
假设更改发生在修订版 15 中的主干上。然后您将执行以下操作(来自干净的 /branches/1.0 工作副本):
svn merge -c 15 /url/to/repo/path/to/trunk
在理想情况下,修订版的更改是自包含的,并且需要修订版中的所有文件。有时还有你不想合并的额外内容。在这种情况下,在合并之后,将更改还原到您不想合并的文件,测试所有内容,然后提交。合并 -> 还原一些文件 -> 提交工作流有一个缺点,即 subversion 将记录合并的发生,但您已经排除了它的一部分。如果有问题的分支不太可能进一步更改(或重新集成到另一个分支),则可能无关紧要,但我更喜欢为您想要的 1 文件中的更改创建一个补丁文件,并手动将它们应用于分支以用于案例像那样。我不是 100% 确定 cmd 行语法,但我认为它会非常相似:
svn diff -c 15 /path/to/file(在 repo 或其他工作副本中)> my-patch.diff
并使用其他工具应用。我通常在 GUI 中创建/应用补丁,因此具体细节将留给您作为练习。
完成此操作后,您将再次在分支上创建一个新标签,其中将包含您的新合并更改。
svn 复制 /path/to/branches/1.0 /path/to/tags/1.1
然后,您将拥有一个与旧标签相同的新标签,只是对 1 文件进行了更改。在 #3 中,我还将提到您可以重新创建标签(尽管这取决于您使用标签的目的是否是一个好主意)。r,但我只会在标签不代表发货代码的情况下这样做。
2) 实际上,由于按照惯例,标签是只读的,因此来自另一个标签的标签实际上并没有什么不同。但是,如果您改为使用第一个分支,然后创建一个标签(如建议的那样),您稍后可以基于同一分支创建第二个标签(在提交其他更改之后),它将与您的第一个不同仅标记自那时以来已应用于该分支的更改。
3) 同样,您通常会使用分支。如果分支/标签仅在内部使用(我不建议删除已发布代码的发布标签,尽管它并没有真正“丢失”,但通常不需要 - ),您可以删除并重新创建标签。您的标签(工作副本)的消费者可以在标签被删除和重新创建后执行正常的“svn 更新”,并且将继续正常工作,就好像什么都没发生一样。这不能用于#1,但可以用于#2,当您真的只想更新标签时。诀窍是结合标记和分支来实现你想要的。如果您还使用它来部署到网站或其他东西,您可以组合分支、标记和外部。
例如,/path/to/production 可以检查到 /tags/1.0 有一个外部条目,当您想要应用修复时,您执行 #2 中的步骤并创建 /tags/1.1 并调整外部条目。或者,只需将其指向分支,无需重新创建标签。
我希望这是一个半有用的开始。