将Subversion仓库的版本号获取到代码中

41

我希望能够在代码中实现记录项目版本的方法,以便在测试和跟踪错误时使用。看起来最好使用的版本号应该是从Subversion获取的当前修订号。是否有一种简单的方法将这个数字连接到一个(在我这种情况下是C++)头文件或其他文件中,然后我可以在代码中使用?我想这可能是一个提交后钩子之类的东西吧?

请问有没有任何实现此功能的经验(请提供代码分享),或者可以建议更好的替代方案?谢谢。

7个回答

27

两种方法:

一是在代码中嵌入$Id$$Revision$,然后设置文件的svn:keywords="Id Revision" 属性。这将显示该源文件的最后修改版本。适用于较小的项目和脚本。

另一种方法是使用Makefile驱动的过程和命令行工具svnversion。(语言相关-这适用于C/C++)

echo -n "#define VERSION 1.0.1-" > version.h
svnversion -n . >> version.h

或使用一些更复杂的构建脚本,其中包括sed和version.h.in。然后只需#include version.h

这将为您提供存储库版本号,该版本号将在每次提交/更新时更改,并且对于大多数项目来说可能是更合适的版本号。

注意:我还使用了一个手动更新的可读性较高的版本字符串。此示例将给出:版本:1.0.1-r13445

〜J


14

您也可以使用 TortoiseSVN 中的 SubWCRev。

SubWCRev 是一个 Windows 命令行程序,可用于读取 Subversion 工作副本的状态,并在模板文件中进行关键字替换(可选)。这通常作为构建过程的一部分使用,作为将工作副本信息合并到正在构建的对象中的一种方式。通常它可以被用于在“关于”框中包含版本号。

http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev.html


14

虽然巧妙,但是revision关键字技巧只在该版本中更改文件时更新文件 - 如果您不更改文件,则它将继续反映旧版本。

如果您希望软件始终反映总的修订号,则必须深入研究相关的SVN条目文件并提取它,这并不难(它是一个XML文件)。

维基百科在其版本页面上执行此操作以指示正在运行的软件的修订版本; 代码位于此处 - 查找getSvnRevision() 方法。


你需要递归地检查所有条目文件,以找到最高的修订号。我猜这就是 svnversion 所做的事情。 - Arne Evertsson
3
svnversion似乎返回整个代码库最后一次更改的版本(而不仅仅是您的工作副本路径)。请参阅我针对此相关问题提供的答案,了解我是如何解决这个问题的:https://dev59.com/_nVD5IYBdhLWcg3wL4mM - hasseg
看起来这会在Subversion 1.7中出现问题,它除了沙盒的顶层之外,还会删除.svn目录。 - Dave Taflin

6
在您的Makefile中添加以下内容:
SVNDEV := -D'SVN_REV="$(shell svnversion -n .)"'
CFLAGS := $(SVNDEV) ...

那么你可以在代码中的任何地方使用宏 SVN_REV,例如:

printf ("Version: SVN %s\n", SVN_REV);

5
您可以使用svn:keywords属性来启用Rev关键字。
然后您可以在您的代码中使用$Rev$,当更新到$Rev: 256 $时,SVN会自动展开它,然后进行解析...
有关Subversion手册的更多信息,请参见此处

6
如果你想要一个完整项目版本号,那么$Rev$并不是正确的选择,因为$Rev$只有在文件更新时才会改变,而不是在整个项目更新时改变。 - Charles Duffy

0
一个好的最新解决方案:
在与 YourFile.dox 相同的文件夹中创建一个包含以下行的 Makefile
sed "s~RevNumber~$(shell svnversion ../)~g" YourFile.dox > YourFileDummy.dox; doxygen YourFileDummy.dox

并且YourFile.dox应该包含如下内容:

...
PROJECT_NUMBER         = "Revision RevNumber"
...

现在:
  1. sed 将 .dox 中的 RevNumber 替换为 svnversion 的输出(在您的代码库的主文件夹中执行),并将修改后的文件保存为 YourFileDummy.dox
  2. YourFileDummy.dox 执行 doxygen 以生成文档
  3. 您的文档现在将包含修订号!

0
将以下内容添加到文件顶部应该能解决问题。
[Subversion]
Revision = "$Revision: $"
Author   = "$Author:   $"
Date     = "$Date:     $"
HeadURL  = "$HeadURL:  $"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接