web-dev-qa-db-ja.com

PHPでSubversionのリビジョン番号を取得するにはどうすればよいですか?

PHPアプリケーションに、使用するリビジョン番号のラベルを付けてもらいたいのですが、 CruiseControl を使用したり、ファイルを更新して毎回アップロードしたりしたくありません。 。どうすればよいですか?

30
Thomaschaaf

SVNキーワードは良い解決策ではありません。他の人が指摘したように、ファイルに$ Revision $を追加すると、特定のファイルにのみ影響し、長期間変更されない可能性があります。

すべてのコミットの前に(空白行を追加または削除して)ファイルを「編集」することを忘れないでください。手でリビジョンを入力することもできます。

それを行うための1つの良い方法(私が知っている)は、自動化された展開プロセス(これは常に良いことです)を持ち、コマンド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ファイルをローカルで作成し、コードを圧縮し、アップロードして抽出します。

53
daremon

WebルートがSubversionツリーのチェックアウトされたコピーであると仮定すると、/。svn/entrysファイルを解析して、リビジョン番号(ここでは4行目)をフックアウトできます...

PHPの場合:

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

これが私がそれを機能させる方法です。サーバーが Shell_exec を許可するように設定されていて、SVNがインストールされている場合は、次のコマンドを実行します。

$revision = `svnversion`;

または

$revision = Shell_exec('svnversion');
8
Nathan J.B.

から この答え

あなたはあなたのコードのどこかに以下を追加することによってそれを行うことができます

$Id:$ 

たとえば、ジェフは次のようにしました。

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

サーバーにチェックインすると、$ Id:$が現在のリビジョン番号に置き換えられました。私も見つけました この参照

$ Date:$、$ Rev:$、$ Revision:$もあります

4
Espo

今は少し遅れていますが、Subversionのコミット後フックを使用してください。リポジトリのhooksフォルダーに、次のようなシェルスクリプトを作成します。

#!/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の発生を実際のリビジョン番号に置き換えます。

フックの詳細 ここ

3
Mark

次のようにすることもできます。

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

ほとんどの場合、サーバー上のコードには、実際にはチェックアウトではなくコードの「エクスポート」が含まれているため、.svnフォルダーは含まれていません。少なくとも、それは私が最もよく見るセットアップです。他の人は実際に自分のコードをWebサーバーにチェックアウトしていますか?

2
Kibbee

最も簡単な方法は、Subversionの「KeywordSubstitution」を使用することです。 SVNブックにガイド ここ があります(Subversionによるバージョン管理)。

基本的には、ファイルのどこかに$ Rev $というテキストを追加するだけです。次に、リポジトリでキーワードを有効にします。チェックアウト時に、SVNはリビジョン番号をファイルに置き換えます。

2

SVNキーワード で近づくことができます。リビジョンを表示する場所に$ Revision $を追加しますが、特定のファイルが変更された最後のリビジョンのみが表示されるため、毎回ファイルに変更を加える必要があります。グローバルリビジョン番号を取得するには、何らかの外部スクリプトまたはコミット後のフックがないと不可能です。

2
noah

同様の質問に対する私の回答を参照してください"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
fijiaaron
$svn_rev=file_get_contents('/path.to.repository/db/current');
1
Inpassor

パフォーマンスが問題になる場合は、次のことができます。

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

もちろん、これはチェックアウトを行ったことと、svnコマンドの存在に依存します。

0
Jonathon Hill

これを行う別の可能性は、「展開プロセス」で説明されているステップを実行するcronを実行することです(* nix/FreeBSDサーバーであると想定しています)。

0
Andrei Iarus