PHPアプリケーションに、使用するリビジョン番号のラベルを付けてもらいたいのですが、 CruiseControl を使用したり、ファイルを更新して毎回アップロードしたりしたくありません。 。どうすればよいですか?
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ファイルをローカルで作成し、コードを圧縮し、アップロードして抽出します。
WebルートがSubversionツリーのチェックアウトされたコピーであると仮定すると、/。svn/entrysファイルを解析して、リビジョン番号(ここでは4行目)をフックアウトできます...
PHPの場合:
$svn = File('.svn/entries');
$svnrev = $svn[3];
unset($svn);
これが私がそれを機能させる方法です。サーバーが Shell_exec を許可するように設定されていて、SVNがインストールされている場合は、次のコマンドを実行します。
$revision = `svnversion`;
または
$revision = Shell_exec('svnversion');
今は少し遅れていますが、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の発生を実際のリビジョン番号に置き換えます。
フックの詳細 ここ
次のようにすることもできます。
$status = @Shell_exec('svnversion '.realpath(__FILE__));
if ( preg_match('/\d+/', $status, $match) ) {
echo 'Revision: '.$match[0];
}
ほとんどの場合、サーバー上のコードには、実際にはチェックアウトではなくコードの「エクスポート」が含まれているため、.svnフォルダーは含まれていません。少なくとも、それは私が最もよく見るセットアップです。他の人は実際に自分のコードをWebサーバーにチェックアウトしていますか?
最も簡単な方法は、Subversionの「KeywordSubstitution」を使用することです。 SVNブックにガイド ここ があります(Subversionによるバージョン管理)。
基本的には、ファイルのどこかに$ Rev $というテキストを追加するだけです。次に、リポジトリでキーワードを有効にします。チェックアウト時に、SVNはリビジョン番号をファイルに置き換えます。
SVNキーワード で近づくことができます。リビジョンを表示する場所に$ Revision $を追加しますが、特定のファイルが変更された最後のリビジョンのみが表示されるため、毎回ファイルに変更を加える必要があります。グローバルリビジョン番号を取得するには、何らかの外部スクリプトまたはコミット後のフックがないと不可能です。
同様の質問に対する私の回答を参照してください"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
$svn_rev=file_get_contents('/path.to.repository/db/current');
パフォーマンスが問題になる場合は、次のことができます。
exec('svn info /path/to/repository', $output);
$svn_ver = (int) trim(substr($output[4], strpos($output[4], ':')));
もちろん、これはチェックアウトを行ったことと、svnコマンドの存在に依存します。
これを行う別の可能性は、「展開プロセス」で説明されているステップを実行するcronを実行することです(* nix/FreeBSDサーバーであると想定しています)。