如何在PHP中获取Subversion版本号?

31

我希望我的PHP应用程序能够标记使用的修订号,但我不想使用CruiseControl或每次更新文件并上传。我该怎么做?

13个回答

53

SVN关键字不是一个好的解决方案。正如其他人指出的那样,在文件中添加$Revision$只会影响到特定的文件,而这个文件可能很长时间都不会发生变化。

在每次提交前记得“编辑”一个文件(通过添加或删除空行),这是没有意义的。你完全可以手动输入版本号。

另一个好的方法(我知道的)是拥有一个自动化部署过程(这总是件好事),并使用命令svnversion。以下是我的做法:

无论在何处需要版本号,我都会进行引用:<?php include 'version.php'; ?>。这个“version.php”文件只包含版本号。此外,它不是存储库的一部分(它被设置为被忽略)。以下是我创建它的方法:

1)在安装了SVN的服务器上的项目中,我也将其用于部署。获取最新版本到服务器之后,我有一个脚本执行以下操作(在服务器上运行):

cd /var/www/project
svn update
rm version.php
svnversion > version.php

2)在没有安装SVN的项目中,我的部署脚本要更复杂一些:它会在本地创建version.php文件,压缩代码,上传并解压。


你的回答好处在于它是与语言无关的:svnversion 将修订号保存在文本文件中,需要该值的应用程序稍后访问该文件。 - AxeEffect

16

假设您的网站根目录是Subversion版本库的检出副本,您可以解析/.svn/entries文件并提取修订版本号(此处为第四行)...

在PHP中实现:

$svn = File('.svn/entries');
$svnrev = $svn[3];
unset($svn);

8
使您的应用程序依赖于Svn内部。对不起,绝对不行。 - Brent.Longborough
11
如果可以的话,我会给你的评论点“踩”,但我做不到,所以我留下这个评论代替。 - Annika Backstrom
我想指出这种方法比调用系统命令更快。它易于实现,并不会造成严重的性能问题。 - Jonathon Hill
1
只是指出一件事情:这个数字只有在文件夹更新时才会更新。 - mauris
5
Subversion 1.7 不再使用 .svn/entries 文件来达到此目的。如果您的目标系统没有 svn 二进制文件可用,则需要查看 .svn/wc.db sqlite 数据库。 - rymo
显示剩余2条评论

9
这是我让它正常工作的方法。 如果您的服务器设置允许使用shell_exec,并且已安装SVN,请运行以下命令:
$revision = `svnversion`;

或者

$revision = shell_exec('svnversion');

哎呀!一定是又熬夜了。谢谢!已经改正 :) - Nathan J.B.
3
为什么这不是被接受的答案呢?它完美地运作,并且似乎比其他任何方案都要好。你甚至可以将任务定时写入文本文件。谢谢!简单、完美,正是提问者所需。 - ladieu

4

这个答案中得知:

您可以通过在代码的任何位置添加以下内容来实现

$Id:$ 

例如,Jeff 这样做:
<div id="svnrevision">svn revision: $Id:$</div>

当在服务器上检查时,会将$Id:$替换为当前修订号。我还发现了这个参考资料

还有$Date:$、$Rev:$和$Revision:$。


3
小心处理此事。正如daremon所提到的那样,只有当文件发生更改时,SVN关键字才会更新。我有一个代码库,其中这些信息在“关于窗口”中,很少更改。我经常忘记“编辑”该文件以更新版本号。 - Matt Miller

3

有点晚了,但是可以使用Subversion的后提交挂钩(post-commit hook)。在您的代码库的钩子(hooks)文件夹中,创建一个类似于这个的shell脚本:

#!/bin/bash

REPOS="$1"
REV="$2"

cd /web/root
rm -f /web/root/templates/base.html
/usr/bin/svn update
/bin/sed -i s/REVISION/$REV/ /web/root/templates/base.html

这个例子假设你的线上网站在 /web/root 目录下,而开发代码则在其他地方。当你提交一个开发更改时,脚本会删除之前的线上模板(以避免冲突信息),运行更新并将模板中的 REVISION 替换为实际的版本号。
关于 hooks 的更多信息请参见此处

2
你也可以这样做:
$status = @shell_exec('svnversion '.realpath(__FILE__));
if ( preg_match('/\d+/', $status, $match) ) {
    echo 'Revision: '.$match[0];
}

2

在大多数情况下,服务器上的代码实际上会包含一个“Export”而不是一个checkout,并且因此不包含.svn文件夹。至少这是我经常看到的设置。其他人真的会将他们的代码检出到Web服务器上吗?


1
不,你可能是对的。这也可能是生产服务器的最佳行为...您可能不希望人们窥视.svn目录。 - Oli
5
我希望您在服务器配置或至少是 .htaccess 文件中,绝对禁止访问 .svn 目录。否则,您的整个代码都可能被看到。 - Artem Russakovskii

2
最简单的方法是使用Subversion“关键字替换”。在SVN书籍(使用Subversion进行版本控制)中有一个指南这里
你只需要在文件中添加文本$Rev$,然后在你的仓库中启用关键字。在检出时,SVN将把修订号替换为文件中的内容。

2

您可以使用SVN关键字来接近。在您想要显示版本的地方添加$Revision$,但这只会显示该文件上次更改的最新版本,因此每次都需要对文件进行更改。要获取全局修订号,需要某种外部脚本或后提交钩子。


2

请看我对类似问题的回答:“标记”svn导出版本

如果您在导出时捕获版本号,则可以使用以下命令:

svn export /path/to/repository | grep ^Exported > revision.txt

为了仅保留修订版本号,您可以通过此sed命令对其进行管道处理:

svn export /path/to/repository | grep ^Exported | sed 's/^[^0-9]\+\([0-9]\+\).*/\1/' > revision.txt

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