質問
私の Web アプリケーションには、$Rev$ を介して現在のリビジョン番号を保持するファイルがあります。これは正常に動作しますが、ファイルに変更を加えないとコミットされません。
とにかく、単一のファイルを常に SVN サーバーにコミットするように強制することはできますか?
私は Windows 用 TortoiseSVN を使用しているので、コードや詳しい手順があれば役立つでしょう。
解決
TortoiseSVN がインストールされている場合は、SubWCRev ツールも利用できます。$REV$ キーワードを誤用するのではなく、そのツールを使用してリビジョンを取得してください。
定義を含むテンプレート ファイルを作成します。おそらく次のようなものです。
const long WC_REV = $WCREV$;
version.h.tmpl という名前のファイル内
ビルドごとに、SubWCRev を呼び出して、アプリケーションで使用できる「実際の」ファイルを作成します。
SubWCRev パス o\workingcopy パス o\version.h.tmpl パス o\version.h
これにより、version.h.tmpl からファイル version.h が作成され、テキスト $WCREV$ が作業コピーの現在のリビジョンに置き換えられます。
の SubWCRev のドキュメント も役立つかもしれません。
他のヒント
基本的に、次の出力が必要です。 svnversion
ファイル内のコマンド。
このようなファイルは通常、リポジトリの外に保管され、ビルド スクリプトによって自動的に作成されます。あなたも同じようにすることをお勧めします。構築せずに、ただ構築するだけなら、 svn up
サーバー側では、ただ呼び出すだけです svnversion
後 svn up
または、両方のアクションを実行するシェル スクリプトを作成します。
もし、あんたが 持っている 一方、それをリポジトリに保持するには、次のように呼び出します svnversion
コミット前のフックに入れるのが最善の策です。
$Rev$ フラグがどのように機能するかを理解していない可能性があります。Rev フラグの目的は、このリビジョンを常に Subversion リポジトリにコミットすることではありません。目標は、更新時に Rev フラグが常にそのリビジョンになるようにすることです。 リビジョンを含むコードを Subversion に入れる必要はありません。 Subversion は、その情報を追跡するのに非常に優れています。
おそらく見逃しているのは、Revision キーワードが適切に処理されるようにファイルにプロパティを設定する必要があるということです。
svn propset svn:keywords "Revision" file.txt
これにより、更新を行うたびに、$Rev が次のようになります。xxx$ フラグは現在のリビジョンで更新されます。リポジトリにどのようにコミットされるかを心配する必要はありません。
@ゲートキラー:TortoiseSVNはサポートしているようです クライアント側フック.
これは正常に動作しますが、ファイルに変更を加えないとコミットされません。
ファイルが決して変更されない場合、なぜ毎回ファイルをコミットする必要があるのでしょうか?
編集] @sean =彼がやろうとしていることを理解していますが、ファイルがフックやその他のプロセスを介して更新されず、したがって変更されない場合、SVNはそれを選択しません。
アプローチを変更することをお勧めします。毎回ファイルをコミットするということは、そのファイルにグローバル リビジョン番号を暗黙的に保持することを意味します。ユーザーには別のキーワードが必要になる可能性があります。 グローバルキー, 、その存在が説明されていない ここ 実際に言及したことはありません SVNバージョン ただし、解決策につながる可能性があります。
Web サイトを SVN から Web サーバーに展開するスクリプトによってリビジョン番号ファイルが変更される可能性はありますか?
Windows ではどうかはわかりませんが、bash スクリプトを使用すると、次のようなことを行います。
$ version=$(svnversion)
$ svn export . /tmp/staging/
Export complete.
$ echo "Revision: ${version}" > /tmp/staging/version.txt
それから /tmp/staging/version.txt
「リビジョン:1" (または最も高いリビジョン番号)。
もちろん、ファイル内の識別子を次のように置き換えることもできます。 $Rev$
(作成する代わりに version.txt
上の例のように)
クライアントによっては、ファイルに「タッチ」して変更済みのフラグを付けるだけのものを実装できるコミット前フックを提供するものもあります。Visual Studio などを使用している場合は、ファイルに「触れる」ビルド後のタスクを作成できますが、変更をコミットする前に必ずビルドを行う必要があります。
@グラドンマンタンク:なぜなら、そのファイルを最新のリビジョン番号で更新したいからです。彼の質問を最後まで読みましたか?
コミット前のフックが機能する可能性があります。
以前は手動でそれを行う方法がありました。sed を使用するスクリプトを実行して、$Rev$ ファイル内のコメントを現在のタイムスタンプに置き換えます。そうすれば、ファイルの内容が変更され、Subversion がそれをコミットします。
私がしなかったことは、それを次のステップに進めることでした。を使用して Subversion のリポジトリ フック プロセスを自動化します。問題は、フックでファイルの内容を変更できるかどうかがわからないことです。ドキュメントでは、それができないことを示唆しているようです。
代わりに、代わりに実行する小さなスクリプトが必要になると思います。 svn commit
このコマンドは、最初にタイムスタンプを更新してから、通常のコミットを実行します。
ファイルをコミットしても何の役にも立ちません。ファイルは完全バージョンを内部に含めてコミットされるのではなく、キーワードのみに置き換えられます。リポジトリ内のファイルを見ると、これが表示されます。
そのため、代わりに何らかの方法でファイルを強制的に更新する必要があります。
Windows プラットフォームを使用している場合は、TortoiseSVN とともに配布される SubWCRev ツールを使用できます。ドキュメンテーション ここ.
これを行うには、svn pre-commit-hooks を使用できます。
私が念頭に置いている一般的なアイデアは、コミット前にファイルに新しいリビジョン番号を入れる (svnlook を使用して取得する) か、ファイル上の偽のプロパティを変更する (変更する必要がある) ものを作成することです (変更しないと SVN が無視します)。
私が見つけたコミット前フックの詳細については、 このページ 役に立つ。
Web アプリケーション内に SVN リビジョン番号を持つファイルがあることを確認するための最良の方法は、ファイルをコミットするのではなく、ビルド スクリプトの一部として抽出することだと思います。
Maven を使用している場合は、maven-buildnumber-plugin を使用してこれを行うことができます。