如何在PHP中获取Subversion修订版号?

时间:2008-09-21 17:13:35

标签: php svn revision

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

13 个答案:

答案 0 :(得分: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文件,压缩代码,上传并提取它

答案 1 :(得分:16)

假设您的webroot是subversion树的签出副本,您可以解析/.svn/entries文件并挂出修订号(此处为第4行)...

在PHP中:

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

答案 2 :(得分:8)

这就是我开始工作的方式。 如果您的服务器设置为允许shell_exec并且您安装了SVN,则运行:

$revision = `svnversion`;

$revision = shell_exec('svnversion');

答案 3 :(得分:4)

来自this answer

  

您可以通过添加以下内容来完成此操作   你代码中的任何地方

$Id:$ 
  

所以例如Jeff做了:

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

并在签入时   服务器用当前替换了$ Id:$   修订号。我还找到了this reference

     

还有$ Date:$,$ Rev:$,   $修订:$

答案 4 :(得分:3)

现在迟到了,但是使用Subversion post-commit钩子。在存储库的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的实际替换为实际修订号。

有关挂钩的更多信息here

答案 5 :(得分:2)

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

答案 6 :(得分:2)

最简单的方法是使用Subversion“关键字替换”。 SVN一书中有一个指南here Version Control with Subversion )。

您基本上只需在文件中的某处添加文本$ Rev $。 然后在存储库中启用关键字。结账时,SVN会将修订号替换为文件。

答案 7 :(得分:2)

您可以与SVN Keywords近距离接触。在要显示修订版本的位置添加$ Revision $,但这只会显示特定文件更改的最后修订版本,因此您每次都必须对文件进行更改。如果没有某种外部脚本或提交后挂钩,则无法获取全局修订号。

答案 8 :(得分:2)

你也可以这样做:

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

答案 9 :(得分:2)

请参阅我对类似问题的回复 "Mark" svn export with revision

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

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

答案 10 :(得分:1)

$svn_rev=file_get_contents('/path.to.repository/db/current');

答案 11 :(得分:0)

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

答案 12 :(得分:0)

如果表现有问题,那么你可以这样做:

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

这当然取决于您是否已完成结账,以及是否存在svn命令。