如何获得PHP中的Subversion版本号?

时间:2020-03-06 14:30:37  来源:igfitidea点击:

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

解决方案

假设webroot是子版本树的已检出副本,则可以解析/.svn/entries文件并挂钩修订版本号(此处为第4行)...

在PHP中:

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

从这个答案:

You can do it by adding the following
  anywhere in your code
$Id:$
So for example Jeff did:
<div id="svnrevision">svn revision: $Id:$</div>
and when checked in the
  server replaced $Id:$ with the current
  revision number. I also found this reference.
  
  There is also $Date:$, $Rev:$,
  $Revision:$

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

最简单的方法是使用Subversion"关键字替换"。 SVN书(带有Subversion的版本控制)中提供了指南。

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

我们可以通过SVN关键字获得更接近的结果。在要显示修订的位置添加$ Revision $,但这只会显示特定文件已更改的最后一个修订,因此我们每次都必须对文件进行更改。没有某种外部脚本或者提交后挂钩,就不可能获得全局修订号。

SVN关键字不是一个好的解决方案。正如其他人指出的那样,在文件中添加$ Revision $仅会影响特定文件,该文件可能不会长时间更改。

记住在每次提交之前"编辑"文件(通过添加或者删除空白行)是没有意义的。我们也可以手动输入修订。

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

每当需要修订的地方,我都会包含:&lt;?php include'version.php'; ?>。此" version.php"文件仅具有修订号。此外,它不是存储库的一部分(将被忽略)。这是我创建它的方法:

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

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

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

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

我们也可以这样做:

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

请参阅我对类似问题" Mark" svn导出并进行修订的答复。

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

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

要剥离除修订号以外的所有内容,可以通过以下sed命令将其通过管道传送:

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