如何在 UNIX 上获得正确的 svn 版本号?
Posted
技术标签:
【中文标题】如何在 UNIX 上获得正确的 svn 版本号?【英文标题】:how to get correct svn version number on UNIX? 【发布时间】:2014-02-22 05:13:30 【问题描述】:我尝试了各种各样的东西,只有一个工具能做到这一点:来自 TortoiseSVN 的 SubWCRev.exe。
svn info
、svnversion
都是笑话,并不能提供好的结果(因此,请不要发布涉及这些的回复,除非您确定他们可以这样做)。
我从事一个大型项目,并为我们的项目维护构建服务器。构建服务器进行稀疏检出(例如,仅检出我们项目实际使用的一些文件夹)。我的目标很简单:如果有人修改不属于我的稀疏结帐的其他分支或文件夹中的文件,我不希望我的版本号增加。基本上,我的目标是确保相同的输入文件将生成相同的构建结果(例如嵌入的 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 info
或svnversion
是笑话,它们只是包含目录的版本。包括目录版本在内的原因造成问题是由于 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服务器端彻底删除(包括历史版本中的内容)一个文件?