我希望我的PHP应用程序能够标记使用的修订号,但我不想使用CruiseControl或每次更新文件并上传。我该怎么做?
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文件,压缩代码,上传并解压。
假设您的网站根目录是Subversion版本库的检出副本,您可以解析/.svn/entries文件并提取修订版本号(此处为第四行)...
在PHP中实现:
$svn = File('.svn/entries');
$svnrev = $svn[3];
unset($svn);
$revision = `svnversion`;
或者
$revision = shell_exec('svnversion');
有点晚了,但是可以使用Subversion的后提交挂钩(post-commit hook)。在您的代码库的钩子(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
$status = @shell_exec('svnversion '.realpath(__FILE__));
if ( preg_match('/\d+/', $status, $match) ) {
echo 'Revision: '.$match[0];
}
在大多数情况下,服务器上的代码实际上会包含一个“Export”而不是一个checkout,并且因此不包含.svn文件夹。至少这是我经常看到的设置。其他人真的会将他们的代码检出到Web服务器上吗?
您可以使用SVN关键字来接近。在您想要显示版本的地方添加$Revision$,但这只会显示该文件上次更改的最新版本,因此每次都需要对文件进行更改。要获取全局修订号,需要某种外部脚本或后提交钩子。
请看我对类似问题的回答:“标记”svn导出版本。
如果您在导出时捕获版本号,则可以使用以下命令:
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
svnversion
将修订号保存在文本文件中,需要该值的应用程序稍后访问该文件。 - AxeEffect