【问题标题】:How can I get the Subversion revision number in PHP?如何在 PHP 中获取 Subversion 修订号?
【发布时间】:2010-09-11 19:18:51
【问题描述】:

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

【问题讨论】:

    标签: php svn revision


    【解决方案1】:

    查看我对类似问题的回复"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
    

    【讨论】:

      【解决方案2】:

      最简单的方法是使用 Subversion 的“Keyword Substitution”。 SVN 书中有一个指南here (Version Control with Subversion)。

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

      【讨论】:

        【解决方案3】:
        $svn_rev=file_get_contents('/path.to.repository/db/current');
        

        【讨论】:

          【解决方案4】:

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

          $revision = `svnversion`;
          

          $revision = shell_exec('svnversion');
          

          【讨论】:

          • 糟糕!一定又是一个深夜。谢谢!更正:)
          • 这不是公认的答案。比它看起来的任何其他方案都完美且更好。您甚至可以将内容 cron 写入文本文件。谢谢!简单而完美,正是 OP 所要求的
          【解决方案5】:

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

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

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

          【讨论】:

            【解决方案6】:

            现在有点晚了,但使用 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

            【讨论】:

              【解决方案7】:

              你也可以这样做:

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

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  【解决方案9】:

                  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 将修订号保存在一个文本文件中,而需要该值的应用程序稍后会访问该文件。
                  【解决方案10】:

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

                  【讨论】:

                    【解决方案11】:

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

                    【讨论】:

                    • 不,你可能就在那儿。这可能也是生产服务器的最佳行为......您可能不希望人们窥探 .svn 目录。
                    • 我希望您在您的服务器配置中确实禁止访问 .svn 目录,或者至少禁止访问 .htaccess。否则,可以看到您的整个代码。
                    【解决方案12】:

                    来自this answer

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

                    $Id:$ 
                    

                    例如,杰夫做了:

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

                    当签入时 服务器将 $Id:$ 替换为当前 修订号。我还找到了this reference

                    还有$Date:$, $Rev:$, $修订:$

                    【讨论】:

                    • 小心这个。正如daremon 提到的,除非该文件已更改,否则SVN 关键字不会更新。我有一个代码库,此信息位于“关于窗口”中,很少更改。我经常忘记“编辑”该文件以更新 Rev ID。
                    【解决方案13】:

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

                    在 PHP 中:

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

                    【讨论】:

                    • 使您的应用程序依赖于 Svn 内部。对不起,不可以
                    • @Brent.Longborough 如果可以的话,我会否决你的评论,但我不能,所以我会留下这条评论。
                    • 实际上这看起来比使用可能“不存在”的 svnversion 二进制文件更便携,尤其是考虑到 windows 系统、开发人员结帐等。
                    • 只是指出一点:这个数字只有在文件夹更新时才会更新。
                    • Subversion 1.7 不再为此目的使用 .svn/entries 文件;如果您的目标系统没有可用的 svn 二进制文件,您将不得不挖掘 .svn/wc.db sqlite 数据库。
                    猜你喜欢
                    • 2010-10-13
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-09-26
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多