如何在每次提交时提交subversion修订版以便在两个存储库之间进行引用

时间:2009-11-06 05:47:10

标签: svn repository versioning revision auto-versioning

考虑将软件分布在两个独立的存储库Pub和Priv中。 Pub存储库是公共的。私人关闭。当任一方改变时,持续集成服务器构建Pub和Priv。然后,它从Priv创建可下载的二进制文件,供Pub的用户使用。这些二进制文件在内部标记,并在文件名上标记为subversion版本。

问题是:如何让Pub构建的程序知道正确的相应Priv版号,以便他们可以自动下载并运行?

当前解决方案是构建服务器修改Pub中的文件以设置Priv的修订号并将这些更改提交到Pub。然而,这提出了两个重要问题:

  1. 构建需要很长时间,因此如果有人在构建期间提交Pub(或Priv)更改,则会产生冲突。这可以被强制解决,但是日志历史看起来很奇怪,好像这些修订进入了那个版本。

  2. subversion日志包含许多条目,例如“Auto build updated the version”。每次构建运行时都会对其他信息丰富的颠覆日志进行监管。

  3. 我们可以这样做,不需要更改存储库。

    此致 韦恩

3 个答案:

答案 0 :(得分:1)

您可以使用revision property(请参阅标题为“Unversioned属性”的部分)将适当的Priv版本存储到适当的Pub版本。修订版属性的好处是它们不需要提交 - 所以没有历史污染。

Subversion使用的修订版属性附加到特定修订版而不是版本化文件夹。与附加到文件或文件夹的属性不同,这些属性是非版本化的。他们只是立即申请。通过使用--revprop开关将“svn propset”添加到修订属性。在TortoiseSVN中,它们通过历史记录日志添加(右键单击修订版,然后选择“显示修订版属性”)而不是文件或文件夹的属性,并立即应用而不进行提交。

例如,要将Priv的r1234与Pub的r6789相关联,您可以通过结帐Pub来执行此操作。

svn propset --revprop -r6789 "priv:version" "1234"

现在,当建立Pub的r6789时,你可以这样做

svn propget --revprop -r6789 "priv:version"

检索适当的Priv版本号。为了应对在最后一次Priv构建之后发生的其他提交,您的脚本必须“走”下来,询问每个版本的“priv:version”,直到获得一个值。或者你可以有一个post-commit钩子,它将属性复制到每个修订版本。

但是,有一点困难。您需要有一个pre-revprop-change挂钩,它允许您使用修订属性。最简单的方法是让它始终返回0,因此允许任何revprop。在Windows上,我只是在hooks目录中创建一个空的“pre-revprop-change.bat”文件。如果你看一下创建属性时提供的示例钩子脚本,它实际上已经很好地记录了。

答案 1 :(得分:0)

我可以想到几种方法来做到这一点。我认为由于某种原因,不可能使修订号直接相互对应,这将是明显和最简单的解决方案。

一种方法是使用Pub的提交消息来包含指向相应Priv修订的指针,例如“与Priv r1234对应”。

另一种方法是将存储库之外的对应关系存储在一些简单的数据库甚至文本文件中,只要将Priv的提交推送到Pub,就会更新这些对应关系。

另一种方法是不像目前那样单独提交记录Priv修订版,而是将该更改添加到应该记录的提交中。

答案 2 :(得分:0)

抱歉,stackoverflow不允许我自己回复或编辑我的帖子或你的答案,因为我在问这个问题时没有注册。所以这里有回复......

西蒙:谢谢。为什么建议修改属性不需要提交? nant构建脚本当前使用修订属性来跟踪分支版本以进行合并和重新集成(svn的内置合并能力太容易混淆)。但是那些修订属性需要提交到中央存储库,并且您的链接指的是用于此的相同类型的修订属性。您是指其他类型的修订属性吗?

关键技能:是的,用于提交“Autobuild已更新至版本0.5.6.1049”的消息是可自定义的。该提交实际上发生在nant构建脚本中,该脚本由CI使用Hudson执行。并且,请记住,我们希望消除该提交,因为每次提交到Pub后都会有一个(或多个)污染日志的自动消息。

Mark:re:提交指向Priv的指针。提交pub的用户无权访问Priv,因此他们不知道修改版本 - 否则是个好主意。另一方面,自动构建现在在构建pub和priv时执行此操作,但是通过大量自动提交污染日志文件只是为了将没有任何其他实质性更改的版本链接到Priv。

Mark:我们考虑过将这些通信存储在存储库之外,但这会导致另一个我们无法解决的问题。解决这个问题,你就赢了答案。问题是pub存储库包含的软件依赖于Priv的二进制文件以及完全对应的版本。因此它包括一个“自动更新”功能,该功能连接到拥有Priv的服务器并请求二进制文件的列表并下载它们。关键是开始下载的主要参数是版本。

Mark:那么问题是Pub如何知道要下载哪个版本?现在,这是由原始问题的情况解决的。 auto build nant脚本提交对Pub中源代码的更改以包含Priv的版本号,但这就是使用“Auto build updated the version ..”污染Pub日志的原因。如果要从Web服务器请求Priv二进制文件,则自动更新工具使用该版本。一切正常。

Mark:首先,通过切换关系使Pub软件自动更新使用它的版本 - Pub的版本 - 并且Web服务器使用单独的文件来匹配它,可以解决第二个问题。 Priv二进制文件的最新匹配版本。然而,低,看,似乎没有实用的方法让Pub软件知道每次提交的版本。

Mark:如果你将$ Rev $关键字放在自动更新代码中,它只会更新它,以便修改该文件。在使用Subversion时,这似乎是一个“古老的”挑战。似乎预提交钩子可以使用版本更新源代码,但似乎只有有人提交有问题的auto udpate源文件。

Mark:你的最后一个想法有点令人困惑,但听起来就像上面提到的那样,将版本信息包含在Pub中,而不是另外进行自动提交。我喜欢这个,但无法弄清楚(谷歌搜索和阅读论坛和帖子超过一天)。这似乎是一个常见的挑战,如何提交项目范围版本以及任何普通的Subversion提交,因为它只是单独版本文件。即使你在预提交钩子中使用svnversion它只更新修改过的文件,对吧?那么自动构建源代码如何在运行时知道什么版本?

每个人:感谢大家的问题和回答。它有助于缩小对问题的理解,以便我们找到解决方案!所以。很酷!