将 Subversion 存储库编号获取到代码中

Getting the subversion repository number into code

提问人:Ali Parr 提问时间:8/19/2008 最后编辑:CommunityAli Parr 更新时间:7/13/2023 访问量:49100

问:

我想实现一种在代码中记录项目版本的方法,以便在测试时使用它并帮助跟踪错误。 似乎最好的版本号只是 Subversion 的当前修订号。有没有一种简单的方法可以将这个数字挂接到(在我的情况下是 C++)头文件或其他东西中,然后我可以在代码中得到它?我想这是一个提交后钩子还是什么?

有没有人有实现这个的经验(请分享代码?),或者可以提出一个更好的替代方案? 谢谢。

SVN 调试 测试 修订 版本

评论


答:

5赞 Vincent Robert 8/19/2008 #1

您可以使用该属性来启用关键字。svn:keywordsRev

然后,您可以在代码中使用,SVN 将在更新时自动扩展它,然后可以解析...$Rev$$Rev: 256 $

更多关于 Subversion 手册的信息

评论

6赞 Charles Duffy 10/28/2008
如果您想要一个完整的项目版本号,这不是正确的选择,因为 $Rev$ 仅在更新该文件时更改,而不是在更新项目中的任何内容时更改。
27赞 jmanning2k 8/19/2008 #2

两种方式:

在代码中嵌入 $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赞 Rob 8/30/2008 #3

虽然很漂亮,但 revision 关键字技巧仅在该修订版中更改文件时更新文件 - 如果您不更改文件,那么它将继续反映旧修订版。

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

维基百科在他们的版本页面上这样做,以指示正在实时运行的软件的修订版;代码在这里 - 查找 getSvnRevision() 方法。

评论

0赞 Arne Evertsson 10/14/2008
您必须递归检查所有条目文件,以找到最高的修订号。我想这就是 svnversion 的作用。
3赞 hasseg 10/30/2008
svnversion 似乎返回了整个存储库的最后更改版本(而不仅仅是 WC 的路径)。请参阅我对这个相关问题的回答,了解我是如何解决这个问题的:stackoverflow.com/questions/56227/......
0赞 Dave Taflin 6/4/2015
看起来这与 Subversion 1.7 有关,Subversion 1.7 消除了除沙箱顶层之外的所有 .svn 目录。
14赞 Bill 10/9/2008 #4

您还可以使用 SubWCRev,它是 TortoiseSVN 的一部分。

SubWCRev 是 Windows 控制台程序,可用于读取 Subversion 工作副本的状态,并可选择在模板文件中执行关键字替换。这通常用作生成过程的一部分,作为将工作副本信息合并到正在生成的对象中的一种方式。通常,它可能用于在“关于”框中包含修订号。

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

6赞 iCoder 5/11/2013 #5

在 Makefile 中,添加:

SVNDEV := -D'SVN_REV="$(shell svnversion -n .)"'
CFLAGS := $(SVNDEV) ...

然后,您可以在代码中的任何位置使用宏,例如:SVN_REV

printf ("Version: SVN %s\n", SVN_REV);
0赞 Jesse 4/18/2017 #6

一个好的最新解决方案:

创建一个包含以下行(与 :MakefileYourFile.dox

sed "s~RevNumber~$(shell svnversion ../)~g" YourFile.dox > YourFileDummy.dox; doxygen YourFileDummy.dox

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

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

现在:

  1. sed将 .dox 中的输出替换为 (在存储库的主文件夹中执行),并将修改后的文件保存到RevNumbersvnversionYourFileDummy.dox
  2. doxygen执行以生成文档YourFileDummy.dox
  3. 您的文档现在将包含修订号!
0赞 K. Furkan BEK 7/13/2023 #7

将以下内容添加到文件顶部应该可以解决问题

[Subversion]
Revision = "$Revision: $"
Author   = "$Author:   $"
Date     = "$Date:     $"
HeadURL  = "$HeadURL:  $"