30

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

4

13 回答 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 文件,压缩代码,上传并提取它

于 2008-09-22T16:44:40.390 回答
16

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

在 PHP 中:

$svn = File('.svn/entries');
$svnrev = $svn[3];
unset($svn);
于 2008-09-21T17:20:56.177 回答
8

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

$revision = `svnversion`;

或者

$revision = shell_exec('svnversion');
于 2011-07-01T16:53:03.577 回答
4

这个答案

您可以通过在代码中的任何位置添加以下内容来做到这一点

$Id:$ 

例如,杰夫做了:

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

并在服务器签入时将 $Id:$ 替换为当前修订号。我也找到了这个参考

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

于 2008-09-21T17:22:42.867 回答
3

现在有点晚了,但使用 Subversion 提交后挂钩。在存储库的 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 替换为实际的修订号。

更多关于钩子的信息

于 2011-04-28T09:25:20.203 回答
2

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

于 2008-09-21T17:23:37.980 回答
2

最简单的方法是使用 Subversion 的“Keyword Substitution”。SVN 书中有一个指南(带有 Subversion 的版本控制

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

于 2008-09-21T17:25:03.810 回答
2

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

于 2008-09-21T17:27:54.880 回答
2

你也可以这样做:

$status = @shell_exec('svnversion '.realpath(__FILE__));
if ( preg_match('/\d+/', $status, $match) ) {
    echo 'Revision: '.$match[0];
}
于 2009-11-27T14:47:40.157 回答
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
于 2010-03-03T18:45:10.723 回答
1
$svn_rev=file_get_contents('/path.to.repository/db/current');
于 2014-09-29T07:41:15.303 回答
0

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

于 2009-11-27T14:32:01.017 回答
0

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

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

这当然取决于您是否进行了结帐,以及 svn 命令的存在。

于 2011-01-28T20:05:08.550 回答