Svn 将subversion存储库编号转换为代码

Svn 将subversion存储库编号转换为代码,svn,debugging,testing,revision,versions,Svn,Debugging,Testing,Revision,Versions,我想实现一种在代码中记录项目版本的方法,以便在测试时使用它并帮助跟踪bug。 似乎最好使用的版本号应该是Subversion当前的版本号。有没有一种简单的方法可以将这个数字挂接到(在我的例子中是C++)头文件或其他文件中,然后我可以在代码中找到它?我猜这是一个提交后钩子还是什么 有没有人有实现这一点的经验(请分享代码?),或者可以建议更好的替代方案? 谢谢。您可以使用svn:keywords属性启用Rev关键字 然后,您可以在代码中使用$Rev$,SVN将在更新到$Rev:256$时自动展开它,

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

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

您可以使用
svn:keywords
属性启用
Rev
关键字

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

有两种方式:

在代码中嵌入$Id$或$Revision$。然后在文件上设置svn:keywords=“Id Revision”属性。这将为您提供该源文件的上次修改版本。适用于较小的项目和脚本

或者,使用Makefile驱动的进程和命令行工具sversion。(特定于语言-这应该适用于C/C++)

或者使用sed和version.h.in编写更复杂的构建脚本。那么就包括version.h

这将为您提供存储库版本号,该版本号将随着每次提交/更新而更改,对于大多数项目来说,这可能是一个更合适的版本号

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


~J

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

如果您希望软件始终反映总体修订号,那么您必须深入研究并提取它,这并不太困难(它是一个XML文件)


Wikipedia这样做是为了表明运行live的软件的版本;-查找getSvnRevision()方法。

您也可以使用SubWCRev,它是龟甲vn的一部分

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

在Makefile中,添加:

SVNDEV := -D'SVN_REV="$(shell svnversion -n .)"'
CFLAGS := $(SVNDEV) ...
然后,您可以在代码中的任何位置使用宏
SVN_REV
,例如:

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

一个好的最新解决方案:

创建一个包含以下行的
Makefile
(与
YourFile.dox
在同一文件夹中):

YourFile.dox
应包含以下内容:

...
PROJECT_NUMBER         = "Revision RevNumber"
...
现在:

  • sed
    svversion
    (在存储库的主文件夹中执行)的输出替换.dox中的
    RevNumber
    ,并将修改后的文件保存到
    YourFileDummy.dox
  • doxygen
    YourFileDummy.dox
    上执行以生成文档
  • 您的文档现在将包含修订号
    您必须递归地检查所有条目文件,以找到最高版本号。我猜这就是svnversion所做的。svnversion似乎返回整个存储库的最后一次更改版本(不仅仅是WC的路径)。请参阅我对如何解决此问题的相关问题的回答:这似乎与Subversion 1.7不同,Subversion 1.7消除了除沙箱顶层之外的所有.svn目录。如果您想要完整的项目版本号,这不是正确的做法,因为$Rev$仅在该文件更新时才会更改,项目中的任何内容更新时都不会。
    sed "s~RevNumber~$(shell svnversion ../)~g" YourFile.dox > YourFileDummy.dox; doxygen YourFileDummy.dox
    
    ...
    PROJECT_NUMBER         = "Revision RevNumber"
    ...