【发布时间】:2010-09-11 19:18:51
【问题描述】:
我想让我的 PHP 应用程序标有它使用的修订号,但我不想使用 CruiseControl 或每次都更新文件并上传它。我该怎么做?
【问题讨论】:
我想让我的 PHP 应用程序标有它使用的修订号,但我不想使用 CruiseControl 或每次都更新文件并上传它。我该怎么做?
【问题讨论】:
查看我对类似问题的回复"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
【讨论】:
最简单的方法是使用 Subversion 的“Keyword Substitution”。 SVN 书中有一个指南here (Version Control with Subversion)。
您基本上只需在文件中的某处添加文本 $Rev$。 然后在您的存储库中启用关键字。结帐时,SVN 会将修订号替换到文件中。
【讨论】:
$svn_rev=file_get_contents('/path.to.repository/db/current');
【讨论】:
这就是我让它工作的方式。 如果您的服务器设置为允许shell_exec 并且您安装了 SVN,只需运行:
$revision = `svnversion`;
或
$revision = shell_exec('svnversion');
【讨论】:
如果性能是一个问题,那么您可以这样做:
exec('svn info /path/to/repository', $output);
$svn_ver = (int) trim(substr($output[4], strpos($output[4], ':')));
这当然取决于您是否进行了结帐,以及是否存在 svn 命令。
【讨论】:
现在有点晚了,但使用 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 替换为实际的修订号。
更多关于钩子here
【讨论】:
你也可以这样做:
$status = @shell_exec('svnversion '.realpath(__FILE__));
if ( preg_match('/\d+/', $status, $match) ) {
echo 'Revision: '.$match[0];
}
【讨论】:
另一种可能的做法是运行一个 cron 来执行“部署过程”中描述的步骤(假设它是一个 *nix/FreeBSD 服务器)。
【讨论】:
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 将修订号保存在一个文本文件中,而需要该值的应用程序稍后会访问该文件。
您可以与SVN Keywords 亲密接触。在您希望显示修订的位置添加 $Revision$,但这只会显示特定文件更改的最后一个修订,因此您每次都必须对文件进行更改。如果没有某种外部脚本或提交后挂钩,就无法获取全局修订号。
【讨论】:
在大多数情况下,服务器上的代码实际上包含代码的“导出”,而不是结帐,因此不包含 .svn 文件夹。至少这是我最常看到的设置。其他人是否真的将他们的代码签出到 Web 服务器上?
【讨论】:
来自this answer:
您可以通过添加以下内容来做到这一点 代码中的任何位置
$Id:$
例如,杰夫做了:
<div id="svnrevision">svn revision: $Id:$</div>
当签入时 服务器将 $Id:$ 替换为当前 修订号。我还找到了this reference。
还有$Date:$, $Rev:$, $修订:$
【讨论】:
假设您的 webroot 是 subversion 树的签出副本,您可以解析 /.svn/entries 文件并勾出修订号(此处为第 4 行)...
在 PHP 中:
$svn = File('.svn/entries');
$svnrev = $svn[3];
unset($svn);
【讨论】: