30

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

4

13 に答える 13

53

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

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

それを行う良い方法の 1 つ (私が知っている) は、自動化されたデプロイ プロセス (これは常に良いことです) を使用し、コマンド svnversion を使用することです。これが私がすることです:

リビジョンが必要な場合はいつでも include: を行います<?php include 'version.php'; ?>。この「version.php」ファイルにはリビジョン番号しかありません。さらに、それはリポジトリの一部ではありません (無視されるように設定されています)。作成方法は次のとおりです。

1) SVN がサーバーにインストールされているプロジェクトでは、デプロイにも使用します。サーバーに最新バージョンを取得する とりわけ次のことを行うスクリプトがあります (サーバー上で実行されます)。

cd /var/www/project
svn update
rm version.php
svnversion > version.php

2) SVN がインストールされていないプロジェクトでは、デプロイ スクリプトはより複雑です。ローカルで version.php ファイルを作成し、コードを圧縮し、アップロードして抽出します。

于 2008-09-22T16:44:40.390 に答える
16

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

PHP の場合:

$svn = File('.svn/entries');
$svnrev = $svn[3];
unset($svn);
于 2008-09-21T17:20:56.177 に答える
8

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

$revision = `svnversion`;

また

$revision = shell_exec('svnversion');
于 2011-07-01T16:53:03.577 に答える
4

この回答から:

コードの任意の場所に次を追加することでそれを行うことができます

$Id:$ 

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

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

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

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

于 2008-09-21T17:22:42.867 に答える
3

今は少し遅れていますが、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の出現箇所を実際のリビジョン番号に置き換えます。

フックの詳細はこちら

于 2011-04-28T09:25:20.203 に答える
2

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

$status = @shell_exec('svnversion '.realpath(__FILE__));
if ( preg_match('/\d+/', $status, $match) ) {
    echo 'Revision: '.$match[0];
}
于 2009-11-27T14:47:40.157 に答える
2

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

于 2008-09-21T17:27:54.880 に答える
2

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

于 2008-09-21T17:23:37.980 に答える
2

最も簡単な方法は、Subversion の「キーワード置換」を使用することです。SVN book ( Version Control with Subversion ) にガイドがあります

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

于 2008-09-21T17:25:03.810 に答える
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
于 2010-03-03T18:45:10.723 に答える
0

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

于 2009-11-27T14:32:01.017 に答える
0

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

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

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

于 2011-01-28T20:05:08.550 に答える