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

在开发分支上使用外部标记SVN签出,svn,version-control,tags,Svn,Version Control,Tags,我们的大多数项目都使用很多通用代码。我们(最终)正在向一个系统迈进,在这个系统中,我们以统一的方式管理共享代码。我们将共享代码视为SVN中的一个单独项目,然后将其作为外部项目引用。然而,在项目开发过程中,我们倾向于将外部库指向开发分支,甚至主干,这是因为将库从一种用法移植到另一种用法时不可避免地会遇到问题 因此,在为发布或内部里程碑标记文件时,我们一直在犯错误。偶尔我们会标记一个项目,而不确保所有外部都已首先标记。我们如何解决这个问题?我正在寻找一些方法来减少出错的可能性,或者在做了这样一个草率

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


因此,在为发布或内部里程碑标记文件时,我们一直在犯错误。偶尔我们会标记一个项目,而不确保所有外部都已首先标记。我们如何解决这个问题?我正在寻找一些方法来减少出错的可能性,或者在做了这样一个草率的标记后进行恢复/修复。理想情况下,解决方案应该是让SVN执行当前政策的一种方式,但我对此类问题的任何经验都感兴趣。

我将使用两种策略来处理该问题

  • 自动标记。在项目上创建标记之前,创建一个shell脚本,将所有svn:external更改为固定的修订/发布标记
  • 使用脚本检查现有标记的一致性。实际上,即使将外部链接到主干中,也可以在标记时重建状态:因为您知道创建标记的日期和时间,您还可以找出此时哪个主干修订处于活动状态,或者修改外部以指向主干的特定修订,或标签制作时的当前版本

  • 此外,您还可以设计一个预提交钩子,用于检查是否正在创建标记,以及是否所有外部都指向固定的修订,如果不是这样,则拒绝提交。

    这听起来很老套,但最好不要引用库的开发分支。如果它是第三方库,您就不会这样做,而且使用您自己的库也不是一个好主意

    这似乎需要更多的工作,但如果您在引用的库中遇到错误,请修复它,标记新版本,并在项目中引用该新标记


    如果您确实必须引用库的开发分支,那么您可以使用预提交钩子脚本来确定何时执行标记,并确保所有引用的外部都是标记版本:如果不是这样,那么脚本可以不通过提交。不过,每次进行提交时都会遇到很大的麻烦。

    我们还想强制执行冻结复制到标记的外部内容的策略,但尚未在服务器上完全实现

    其思想是预提交钩子使用带有事务号的
    svnlook
    命令来检查副本中的任何“tags/”目的地。如果命中,必须检查属性并搜索任何
    svn:externals
    。可能是允许覆盖策略的其他属性


    显而易见的问题是服务器上的负载,以及该钩子使用哪种语言。通常SVN带有更好的PythoncTypes绑定,不幸的是,上次我检查时它不适用于Windows(对于这个目标来说既不可编译)。但是pysvn模块可能刚好能够做到这一点。除了这种语言之外,bash脚本也可以工作,但会很混乱,而且不便于移植。还是纯C…

    而不像对待外部库那样对待内部库?如果您使用ApacheIvy(resp.Maven),那么将库发布到中央存储库(版本号为1.0或SNAPSHOT_20091005)并使用标准Ivy(resp.Maven)机制导入它们将非常容易


    这样,就消除了SVN外部的所有问题。当然,每个项目在创建发布之前都需要使用标签,但这就是“发布101”。

    我同意Martin v。Löwis,但我想指出,如果您只在svn:externals中硬编码一个修订号,那么如果您的externals也定义了自己的svn:externals,您就是在自找麻烦

    在您的情况下,您不想将开发集群外部设置为指定的版本,因为这将锁定您的开发repo。您也不能忽略递归外部。最好的选择是递归地标记所有外部,这允许继续开发,但您可以为所有内容形成自己的标记/分支


    我有一个脚本可以这样做,但在发布之前会先清理一下:)

    Subversion客户端1.9版有一个
    --pin externals
    选项,用于
    svn copy
    ,看起来它完全可以做这里需要的事情


    感谢freenode IRC频道
    #svn
    上的
    danielsh
    (Daniel Shahaf)给出了这个答案。

    的确,最好不要参考库的开发分支。然而,这不是我能做的实际改变,因为我不能控制我同事的行为,也不能保证不会犯错误。你把这个脚本贴在哪里了吗?我也会对这个脚本非常感兴趣。你把它上传到什么地方了吗?如果你有时间创建一个脚本来实现这一点,那么选项2是更好的解决方案。这也是我用于项目标记的选项。对于选项1,您必须小心地知道“外部”存储库(而不是您的根项目修订版)的修订号,如果您从多个不同的存储库中提取外部版本,这将变得更加复杂。同意-svn外部版本似乎比它们的价值更大。无论我在哪里看到它们被使用,没有它们我们会过得更好。