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

Posted

技术标签:

【中文标题】将 subversion 存储库编号获取到代码中【英文标题】:Getting the subversion repository number into code 【发布时间】:2010-09-06 04:27:53 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

一个很好的最新解决方案:

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

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

YourFile.dox 应该包含这个:

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

现在:

    sed 将 .dox 中的 RevNumber 替换为 svnversion 的输出(在存储库的主文件夹中执行)并将修改后的文件保存到 YourFileDummy.dox doxygenYourFileDummy.dox 上执行以生成文档 您的文档现在将包含修订号!

【讨论】:

【参考方案2】:

在您的 Makefile 中,添加:

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

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

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

【讨论】:

【参考方案3】:

您也可以使用属于 TortoiseSVN 的 SubWCRev。

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

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

【讨论】:

【参考方案4】:

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

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

***在their version page 上这样做是为了表明正在运行的软件的版本; the code is here - 寻找 getSvnRevision() 方法。

【讨论】:

您将不得不递归检查所有条目文件,以找到最高修订号。我想这就是 svnversion 所做的。 svnversion 似乎返回了整个存储库的最后一个更改版本(不仅仅是你的 WC 的路径)。请参阅我对这个相关问题的回答,了解我是如何解决这个问题的:***.com/questions/56227/… 这似乎与 Subversion 1.7 不同,它消除了除沙箱顶层之外的所有地方的 .svn 目录。【参考方案5】:

两种方式:

在代码中嵌入 $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

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

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

~J

【讨论】:

【参考方案6】:

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

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

More info on the Subversion manual

【讨论】:

如果您想要一个完整的项目版本号,这不是正确的做法,因为 $Rev$ 仅在更新该文件时更改,而不是在更新项目中的任何内容时更改。

以上是关于将 subversion 存储库编号获取到代码中的主要内容,如果未能解决你的问题,请参考以下文章

将 Subversion 存储库的一部分迁移到新服务器并重新路径

Fork 并将 Google Code Subversion 存储库同步到 GitHub

Subversion存储库中“分支”,“标记”和“主干”的含义是什么?

从 git 推送到 subversion 存储库

在 Subversion 存储库中存储文件权限

移动没有历史记录的 Subversion 存储库