如何让TortoiseSVN在对标签进行操作时始终冻结svn:externals属性

19
这在tortoiseSVN中是否可能?
始终针对tags冻结svn:externals
场景是我们的主干将始终使用外部代码库的“HEAD”版本,然而当我们创建“tags”时,我们希望为它们设置一个特定版本的外部代码库,以便在特定时间点“冻结”它们。
更新
感谢大家的反馈/信息。
既然我找不到完全符合我们需求的任何东西(尝试了smartsvn和svncopy.pl),我制作了一个控制台应用程序,到目前为止它已经通过了我们所有的测试用例。
高级概述:该应用程序接受存储库URL,然后查找所有的外部代码库并为它们添加最后一次提交的版本 - 我做一个' svn info '并获取“提交版本”。
该应用程序适用于文件夹和单个文件的外部代码库。
以下是源代码和完整的设置文件:http://svnxf.codeplex.com/

1
svncopy.pl有什么地方不符合您的需求? - kostmo
请将解决方案发布为答案,而不是问题。 - Lightness Races in Orbit
8个回答

7
我今天在寻找解决同样问题的方法时发现了这篇文章。最后我发现TortoiseSVN在其最新版本中确实支持所需的功能:TortoiseSVN 1.7 Release Notes

希望这可以帮助其他遇到相同问题的人。


在我看来,它存在缺陷,因为它不能冻结外部的外部,这使得该功能在标记和分支到发布分支方面实际上毫无用处。 - Ini
那个问题的唯一解决方法是仅使用带有钉子的外部组件... - Ini

6
推荐的最佳实践是在外部定义中始终使用明确的修订版(而不是HEAD)。根据文档
“您应该认真考虑在所有外部定义中使用明确的修订号。这样做意味着您可以决定何时拉取不同的外部信息快照,以及要拉取哪个快照。...对于软件项目来说,这可能是您构建旧代码库快照成功与否的关键。”
直接回答您的问题:不,TortoiseSVN无法在标记时自动更改外部定义。需要在创建标记时手动执行。

我完全同意标签的使用方式,然而主干代码将始终使用最新版本。 - dnndeveloper
1
即使主干也不应该使用最新版。如果某个依赖项有破坏性的更改应用于它,那么您会发现您的主干构建在多个版本上都是错误的。相反,您应该使用固定版本号,然后一次性完成(a)更新外部定义(b)更新您的代码以支持依赖项中的更改。 - Lightness Races in Orbit
如果你认真考虑过,那么人们会想知道为什么它不是默认设置,以及为什么允许跟踪HEAD... - Benjol

3
您可以尝试使用svncopy.pl(在谷歌上找到它)。 这是一个perl脚本,可以满足您的需求。

懒人专用:https://svn.apache.org/repos/asf/subversion/trunk/contrib/client-side/svncopy/ - kostmo

2
你应该尝试使用 SmartSVN,该工具可以在创建标签或分支时将 HEAD-externals 可选地转换为固定的 externals。你可以在“添加标签/添加分支”对话框的底部找到此选项(外部修订版本:(o) 保持不变 ( ) 修复全部 ( ) 除下面外全部修复)。

尝试过这个,似乎只适用于文件夹外部而不是单个文件外部支持1.6+...第一个成功实现这一点的客户将比其他人拥有更好的优势! - dnndeveloper
根据http://www.syntevo.com/smartsvn/changelog.txt,SmartSVN 6.5.2还修复了文件外部引用的问题。 - Mot

1

我完全同意Michael的观点。

除了SVN文档的建议之外:

  • 在svn:externals中使用非固定版本会使更新工作副本到指定版本(例如在故障调查期间)变得更加困难
  • 带有svn:externals的目录日志将不完整,这可能会提供关于版本之间更改集的虚假信息
  • 分支和合并可能会变得更加复杂

一般来说,SVN似乎主要设计用于包含在公共目录中的代码。即使是按名称添加svn:externals以引用外部存储库,我也会预计会出现其他问题,此外还包括上述提到的问题。

根据我的经验,需要使用svn:externals进行非固定版本的需求通常来自存储库中错误的结构。

也许这不是您的情况,我只是建议考虑这些要点...


1

更新

感谢大家的反馈和信息。

由于我找不到完全符合我们需求的东西(尝试了smartsvn和svncopy.pl),所以我制作了一个控制台应用程序,目前已经通过了我们所有的测试用例。

高级概述:该应用程序接受存储库URL,然后查找所有外部内容并添加它们的最后提交修订版本 - 我执行“svn info”并获取“提交修订版本”。

该应用程序适用于文件夹和单个文件的外部内容。

这是源代码和完整的设置文件:http://svnxf.codeplex.com/


0

您可以在外部指定修订版本:

third-party/skins -r148        http://svn.example.com/skinproj

请查看svnbook


我认为除了编写脚本/程序并始终使用它进行标记外,没有自动执行此操作的方法。 - Sander Rijken

0

我知道这不是针对tortoiseSVN的,但如果你使用带有subversive的eclipse,你可以右键点击项目,然后选择团队->标记。Subversive默认冻结外部和很好地格式化属性。


谢谢 - 我也在寻找一些可以放入我们自动化构建中的东西。 - dnndeveloper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接