如何在 UNIX 上获得正确的 svn 版本号?

Posted

技术标签:

【中文标题】如何在 UNIX 上获得正确的 svn 版本号?【英文标题】:how to get correct svn version number on UNIX? 【发布时间】:2014-02-22 05:13:30 【问题描述】:

我尝试了各种各样的东西,只有一个工具能做到这一点:来自 TortoiseSVN 的 SubWCRev.exe。

svn infosvnversion 都是笑话,并不能提供好的结果(因此,请不要发布涉及这些的回复,除非您确定他们可以这样做)。

我从事一个大型项目,并为我们的项目维护构建服务器。构建服务器进行稀疏检出(例如,仅检出我们项目实际使用的一些文件夹)。我的目标很简单:如果有人修改不属于我的稀疏结帐的其他分支或文件夹中的文件,我不希望我的版本号增加。基本上,我的目标是确保相同的输入文件将生成相同的构建结果(例如嵌入的 svn 编号应该相同)。 来自 tortoise 的 SubWCRev 正是完成这项工作并报告所有签出文件的最后提交修订版。 例如svnversion -cn 是一个近距离的尝试,但它不能正常工作。

想象一下我有这样的结构:

trunk
  |
  +-src
  +-include
  +-lib
    |
    +-Win32
    +-Linux
    +-WinRT

lib 文件夹包含不同操作系统和平台的库。例如,Win32 的大小超过了一个 gig,而在 linux 机器上,我们进行稀疏结帐,例如svn update --set-depth=exclude trunk/lib/Win32 这种方式在我的 linux buildserver 上我什至看不到trunk/lib/Win32。 svnversion -c 的问题在于,即使在被排除的子文件夹中,它也会报告最后提交的 rev。那么,是否有一个工具的行为类似于来自 tortoise svn 的SubWCRev(我不关心它是否能够替换文件中的标签,我只需要它正确提取的最后提交的版本号)。

【问题讨论】:

【参考方案1】:

我不会说svn infosvnversion 是笑话,它们只是包含目录的版本。包括目录版本在内的原因造成问题是由于 Subversion bubbles up the revision of a changed node to the parent and their parents and so on 的方式。如果您将-f 选项传递给SubWCRev,则SubWCRev 的行为方式相同。

恰好有一个*nix 版本的SubWCRev,称为svnwcrev。自从我在 OS X 上构建以来,Makefile 花了一些时间才为我构建它。我必须在 config.mk 文件的 LIBRARIES 行上提供它 -lapr-1 -lsvn_subr-1 -lsvn_wc-1。但它像宣传的那样工作。虽然 Subversion API 的版本控制规则已经很老了,但这意味着它甚至可以针对最新的库(我碰巧针对 1.7 构建它)。如果您走这条路并遇到构建问题,请在此处发表评论,我会尽力帮助您构建它。

恰好还有一个名为SvnRev 的Java 工具,它类似于SubWCRev(没有尝试过,但我认为它可以实现它的承诺)。我对这个建议的唯一担忧是它似乎直接读取了工作副本数据库,这意味着随着我们更改数据库的格式,它将来可能会停止工作。

另一种选择是通过执行svn info --xml -R $WC 基本上滚动您自己,忽略所有带有kind="dir" 的节点并计算提交实体中的最大修订。如果我没有找到上述内容,我可能会这样做,但编写 XPath 代码很痛苦,而且我认为 xsltproc 不提供 max 函数(这使得编写更加烦人)。

如果您希望将其集成到svnversion 中,那么我建议您提供一个选项以使其忽略 users@subversion.apache.org 邮件列表中的目录。鉴于有几个实用程序可以做到这一点,而且它们似乎相当陈旧且维护得不是很好,我认为在 svnversion 中添加这样一个选项不会有太多反对意见。

【讨论】:

以上是关于如何在 UNIX 上获得正确的 svn 版本号?的主要内容,如果未能解决你的问题,请参考以下文章

如何合并svn分支到主干上

浅谈Git与SVN的使用感受

如何从svn服务器端彻底删除(包括历史版本中的内容)一个文件?

TortoiseSVN+SAE如何回滚服务器上的旧版本

如何在 C# windows 服务中使用 Git 标签号代替 SVN 版本号

MAC EI Capitan上更新系统自带SVN版本号(关闭SIP方能sudo rm)