私の Web アプリケーションには、$Rev$ を介して現在のリビジョン番号を保持するファイルがあります。これは問題なく動作しますが、そのファイルに変更を加えないとコミットされません。
とにかく、単一のファイルを常に SVN サーバーにコミットするように強制することはできますか?
私は Windows 用の TortoiseSVN を使用しているので、コードやステップバイステップの説明が役に立ちます。
私の Web アプリケーションには、$Rev$ を介して現在のリビジョン番号を保持するファイルがあります。これは問題なく動作しますが、そのファイルに変更を加えないとコミットされません。
とにかく、単一のファイルを常に SVN サーバーにコミットするように強制することはできますか?
私は Windows 用の TortoiseSVN を使用しているので、コードやステップバイステップの説明が役に立ちます。
基本的にsvnversion
、ファイル内のコマンドの出力が必要です。
このようなファイルは通常、リポジトリから除外され、ビルド スクリプトによって自動的に作成されます。同じことをすることをお勧めします。ビルドせずsvn up
、サーバー側だけの場合は、 svnversion
afterを呼び出すsvn up
か、両方のアクションを実行するシェル スクリプトを作成します。
一方、リポジトリに保持する必要がある場合svnversion
は、pre-commit フックを呼び出すのが最善の策です。
TortoiseSVN がインストールされている場合は、SubWCRev ツールも利用できます。$REV$ キーワードを誤用する代わりに、そのツールを使用してリビジョンを取得してください。
定義を含むテンプレートファイルを作成します。おそらく次のようなものです
const long WC_REV = $WCREV$;
version.h.tmpl という名前のファイルに
すべてのビルドで SubWCRev を呼び出して、アプリケーションで使用できる「実際の」ファイルを作成します。
SubWCRev パス\to\workingcopy パス\to\version.h.tmpl パス\to\version.h
これにより、version.h.tmpl からファイル version.h が作成され、テキスト $WCREV$ が作業コピーの現在のリビジョンに置き換えられます。
SubWCRevのドキュメントも役立つかもしれません。
@gatekiller: TortoiseSVN はClient Side Hooksをサポートしているようです。
これは問題なく動作しますが、そのファイルに変更を加えないとコミットされません。
ファイルが変更されない場合、毎回コミットする必要があるのはなぜですか?
[編集] @Sean = 彼がやろうとしていることは理解できますが、ファイルがフックやその他のプロセスを介して更新されず、したがって変更されない場合、SVN は決してそれを取得しません。
アプローチを変更することをお勧めします。毎回ファイルをコミットすることは、そのファイルにグローバル リビジョン番号を暗黙的に保持することを意味します。そこでユーザーは別のキーワードGlobalKeyを必要とするかもしれませんが、その存在しないことはここで説明されていますが、言及されたsvnversionを実際には使用していませんが、解決策につながる可能性があります。
ウェブサイトを SVN からウェブサーバーにデプロイするスクリプトによって、リビジョン番号ファイルを変更できますか?
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
ファイルをコミットしても何の役にも立ちません。ファイルは完全なバージョンでコミットされず、キーワードだけに置き換えられます。リポジトリ内のファイルを見ると、これが表示されます。
そのため、代わりに何らかの方法でファイルを強制的に更新する必要があります。
Windows プラットフォームを使用している場合は、TortoiseSVN で配布されている SubWCRev ツールを使用できます。ドキュメンテーションはこちら。
svn pre-commit-hooks を使用してそれを行うことができます。
私が念頭に置いている一般的なアイデアは、コミットの前に新しいリビジョン番号をファイルに入れる (svnlook を使用して取得する) か、ファイルの偽のプロパティを変更する (変更する必要があるか、SVN が無視する) というものを作成することです。
pre-commit-hooks の詳細については、このページが役に立ちました。
クライアントによっては、ファイルに単に「タッチ」して変更済みとしてフラグを立てる何かを実装できる pre-commit フックを提供するものもあります。Visual Studio のようなものを使用している場合は、ファイルに「触れる」ポスト ビルド タスクを作成できますが、変更をコミットする前に必ずビルドを実行する必要があります。
@gradonmantank: そのファイルを最新のリビジョン番号で更新したいからです。彼の質問を完全に読みましたか?
pre-commit フックが機能する可能性があります。
以前は手動でそれを行う方法がありました。$Rev$ ファイルのコメントを現在のタイムスタンプに置き換えるために sed を使用するスクリプトを実行します。そうすれば、ファイルの内容が変更され、Subversion によってコミットされます。
私がしなかったのは、それを次のステップに進めることでした。Subversion のリポジトリ フックを使用してプロセスを自動化することです。問題は、フックでファイルの内容を変更できるかどうかわからないことです。ドキュメントは、できないことを示唆しているようです。
svn commit
代わりに、最初にタイムスタンプを更新してから通常のコミットを実行するコマンドの代わりに実行する小さなスクリプトが必要になると思います。
Web アプリケーションに SVN リビジョン番号を持つファイルがあることを確認する最善の方法は、ファイルをコミットするのではなく、ビルド スクリプトの一部として抽出することだと思います。
Maven を使用する場合は、maven-buildnumber-plugin でこれを行うことができます。