我怎样才能在PHP中获得Subversion版本号?

我想让我的PHP应用程序标有它使用的修订版号,但是我不想使用CruiseControl或者每次更新文件并上传它。 我应该怎么做?

SVN关键字不是一个好的解决scheme。 正如其他人所指出的那样,在文件中添加$ Revision $只会影响特定的文件 ,而这个文件很可能不会改变。

记住在每次提交之前“编辑”一个文件(通过添加或删除一个空行)是毫无意义的。 你也可以直接input修改版本。

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

无论我需要修订,我都会做一个包括: <?php include 'version.php'; ?> <?php include 'version.php'; ?> 。 这个“version.php”文件只有版本号。 而且它不是版本库的一部分(它被忽略)。 以下是我如何创build它:

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

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

2)在没有安装SVN的项目中,我的部署脚本比较复杂:它在本地创buildversion.php文件,压缩代码,上传并提取它

假设你的webroot是一个subversion树的签出副本,你可以parsing/.svn/entries文件并勾出修订号(这里是第4行)…

在PHP中:

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

这是我得到它的工作。 如果您的服务器设置为允许shell_exec ,并且您已经安装了SVN,请运行:

 $revision = `svnversion`; 

要么

 $revision = shell_exec('svnversion'); 

从这个答案 :

您可以在代码中的任何位置添加以下代码

 $Id:$ 

因此,例如杰夫做了:

 <div id="svnrevision">svn revision: $Id:$</div> 

并在服务器中选中当前版本号replace$ Id:$。 我也find了这个参考 。

还有$ Date:$,$ Rev:$,$ Revision:$

现在晚了,但是使用了一个Subversion post-commit钩子。 在你的版本库的hooks文件夹中,像这样创build一个shell脚本:

 #!/bin/bash REPOS="$1" REV="$2" cd /web/root rm -f /web/root/templates/base.html /usr/bin/svn update /bin/sed -is/REVISION/$REV/ /web/root/templates/base.html 

这个特殊的例子假设你的网站是在/ web / root,开发代码是在别处。 当您提交开发者更改时,脚本将删除先前的活动模板(以避免冲突消息),运行更新并使用实际版本号replace模板中REVISION的出现次数。

更多的钩子在这里

在大多数情况下,服务器上的代码实际上包含代码的“导出”,而不是结帐,因此不包含.svn文件夹。 至less这是我经常看到的设置。 其他人是否将他们的代码检查到Web服务器上?

您可以近距离使用SVN关键字 。 在你想要显示修订版本的地方添加$ Revision $,但是这只会显示特定文件被修改的最后一个版本,所以你必须每次修改文件。 如果没有某种外部脚本或提交后的钩子,获取全局修订号是不可能的。

最简单的方法是使用Subversion的“关键字replace”。 SVN书( 带有Subversion的版本控制 )有一个指南。

你基本上只需要在你的文件中添加文本$ Rev $。 然后在储存库中启用关键字。 在结帐时,SVN会将版本号replace到文件中。

看到我对类似的问题“马克”svn出口与修订的回应。

如果您在导出时捕获修订号码,则可以使用:

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

要除去版本号以外的所有内容,可以通过以下sed命令来pipe理它:

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

你也可以这样做:

 $status = @shell_exec('svnversion '.realpath(__FILE__)); if ( preg_match('/\d+/', $status, $match) ) { echo 'Revision: '.$match[0]; } 
 $svn_rev=file_get_contents('/path.to.repository/db/current'); 

另一种可能性是运行一个执行“部署过程”(假设它是* nix / FreeBSD服务器)中描述的步骤的cron。

如果performance是一个问题,那么你可以这样做:

 exec('svn info /path/to/repository', $output); $svn_ver = (int) trim(substr($output[4], strpos($output[4], ':'))); 

这当然取决于你做了一个结帐,并存在的svn命令。