我希望我的PHP应用程序标有它使用的修订号,但我不想使用CruiseControl或更新文件并每次都上传它。我该怎么办?
答案 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命令。