在开发分支上使用外部标记SVN签出

时间:2009-10-04 19:42:42

标签: svn version-control tags

我们的大多数项目都使用了很多常用代码。我们(最终)正朝着我们以统一方式管理共享代码的系统迈进。我们将共享代码视为SVN中的单独项目,然后将其作为外部引用。但是,由于将库从一种用户移植到另一种用途不可避免的问题,我们倾向于在项目开发过程中将外部库指向开发分支甚至是主干。

因此,在为发布或内部里程碑标记文件时,我们一直在犯错误。偶尔我们将标记一个项目,而不确保所有外部都已被标记。我们怎样才能解决这个问题?我正在寻找方法来减少错误的可能性或在制作这样的草率标签后恢复/修复。理想情况下,解决方案是使SVN强制执行当前策略的一种方法,但我对任何遇到此类问题的经验感兴趣。

6 个答案:

答案 0 :(得分:11)

我会用两种策略来处理这个问题

  1. 自动化标记。创建一个shell脚本,在项目上创建标记之前,将所有svn:externals更改为固定版本/发布标记。
  2. 有一个脚本可以检查现有标记的一致性。实际上,即使您将外部链接到主干,也可以在标记时重建状态:因为您知道标记创建的日期和时间,您还可以找出该点的主干修订版本,并修改外部指向特定版本的主干,或指向标签制作时的当前版本。
  3. 此外,您还可以提出一个预提交挂钩,检查是否正在创建标记,以及是否所有外部指向固定修订,如果不是这样,则拒绝提交。

答案 1 :(得分:3)

Subversion客户端版本1.9为--pin-externals提供svn copy选项,看起来它将完全符合此处的要求。

感谢danielsh(Daniel Shahaf)关于freenode IRC频道#svn的回答。

答案 2 :(得分:1)

这听起来很陈腐,但最好的办法不是图书馆的参考开发分支。如果它是第三方库,你不会这样做,并且使用你自己的库也不是一个好主意。

看起来似乎工作量更大,但如果您遇到引用库中的错误,请修复它,标记新版本并在项目中引用该新标记。

如果你真的必须引用库的开发分支,你可以使用一个预提交钩子脚本来确定你何时做一个标记,并确保所有引用的外部也是标记版本:然后脚本可能不及提交如果不是这样的话。每次你做一次提交都会受到很大影响。

答案 3 :(得分:1)

我们还希望强制执行冻结复制到标记的外部因素的策略,但尚未在服务器上实现它。

这个想法是让预提交钩子使用svnlook命令和事务编号来检查副本中的任何“tags /”目的地。如果命中,则必须检查属性并搜索任何svn:externals。可能还有其他属性可以覆盖政策。

显而易见的问题是服务器上的负载以及用于该挂钩的语言。通常SVN带有更好的Python Ctypes绑定,不幸的是,上次我检查它不适用于Windows(既不能像这个目标那样可编译)。但是pysvn模块可能就足够了。除了这种语言之外,bash脚本可以工作,但是会很麻烦而且不那么便携。或纯粹的C ......

答案 4 :(得分:1)

虽然不像外部库那样处理内部库?如果您使用Apache Ivy(相应的Maven),将库发布到中央存储库(版本号为1.0或SNAPSHOT_20091005)并使用标准Ivy(相应的Maven)机制导入它们将非常容易。

这样,您可以删除SVN外部的所有问题。当然,每个项目都需要在创建版本之前使用标签,但这是“版本101”。

答案 5 :(得分:1)

我同意Martin诉Löwis的观点,但我想我会指出,如果你只对你的svn:externals中的修订号进行硬编码,那么如果你的外部也定义了他们自己的svn:externals,你会遇到麻烦!

在您的情况下,您不希望将开发中继外部设置为指定的修订版,因为这会锁定您的开发回购。你也不能忽略递归的外部。最好的选择是以递归方式标记所有外部,这样可以继续开发,但是您可以为所有内容构建自己的标记/分支。

我有一个脚本可以执行此操作,但在发布之前会将其清理一下:)