34

デプロイしたバイナリに最新のSVNリビジョン番号のタグ付けを開始したいと思います。

ただし、SVNはファイルベースであり、ディレクトリ/プロジェクトベースではないため、最大のリビジョン番号を特定するには、すべてのディレクトリとサブディレクトリのファイルをスキャンする必要があります。

ルートでの使用svn infoは機能しません(サブディレクトリ内のファイルではなく、そのディレクトリのバージョンを報告するだけです):

svnこれを行うためのコマンドを使用するショートカットがあるかどうか疑問に思いました。それ以外の場合、誰かがネットワーク効率の良い簡単なスクリプトを提案できますか(リモートサーバーにまったくヒットしなかった場合は私が好むでしょう)?

また、代替アプローチの1つは、バージョンファイルを。で保持することであることも理解していますsvn:keywords。これは機能しますが(他のプロジェクトで使用しました)、ファイルがダーティであることを確認し、避けられないマージの競合に対処することにうんざりしています。

回答ルートディレクトリsvn upを呼び出す前に適切な処理を行わないと、問題が発生することがわかります。svn info

$ svn info
Path: .
...
Last Changed Author: fak
Last Changed Rev: 713
Last Changed Date: 2008-08-29 00:40:53 +0300 (Fri, 29 Aug 2008)

$ svn up
At revision 721.

$ svn info
Path: .
...
Revision: 721
Last Changed Author: reuben
Last Changed Rev: 721
Last Changed Date: 2008-08-31 22:55:22 +0300 (Sun, 31 Aug 2008)
4

10 に答える 10

23

一方通行。コードをチェックアウトするときは、svn出力の最後の行を見てください。

$ svn up
...stuff...
Updated to revision 66593.

より直接的な方法:

$ svn info
Path: .
URL: https://svn.example.com/svn/myproject/trunk
Repository Root: https://svn.example.com/svn/
Repository UUID: d2a7a951-c712-0410-832a-9abccabd3052
Revision: 66593
Node Kind: directory
Schedule: normal
Last Changed Author: bnguyen
Last Changed Rev: 66591
Last Changed Date: 2008-09-11 18:25:27 +1000 (Thu, 11 Sep 2008)
于 2008-09-11T10:43:00.050 に答える
22

svnversionこれを行う最もクリーンな方法のようです:

svnversion -c /path/to/your-projects-local-working-copy/. | sed -e 's/[MS]//g' -e 's/^[[:digit:]]*://'

上記のコマンドは、出力から M と S の文字 (ローカルの変更または切り替えを示す) を消去し、リビジョン番号がsvnversion1 つだけではなく範囲を返す場合は小さい方のリビジョン番号を削除します (詳細については、ドキュメントを参照してください)。出力をフィルタリングしたくない場合は、パイプとsedそのコマンドの一部を取り出します。

を使用するsvn info場合は、「再帰」( -R) 引数を使用して、すべてのサブディレクトリからも情報を取得する必要があります。出力は長いリストになるため、いくつかのフィルタリングを行って、最も高いすべてのリビジョン番号から最後に変更されたリビジョン番号を取得する必要があります。

svn info -R /path/to/your-projects-local-working-copy/. | awk '/^Last Changed Rev:/ {print $NF}' | sort -n | tail -n 1

このコマンドが行うことは、文字列 を含むすべての行を"Last Changed Rev"取得し、それらの各行から最後のフィールド (つまりリビジョン番号) を除くすべてを削除し、これらの行を数値順に並べ替えて、最後の行以外のすべてを削除することです。最高のリビジョン番号だけで。たとえば、Windows を実行している場合は、PowerShell でもこれを非常に簡単に実行できると確信しています。

明確にするために:上記のアプローチは、サーバーにアクセスすることなく、ローカル作業コピーが表すリポジトリ内のパスの最終変更リビジョン番号を再帰的に取得ます。そのため、最後の の後に誰かがこのパスの何かをリポジトリ サーバーに更新した場合svn update、それはこの出力に反映されません。

サーバー上のこのパスの最後に変更されたリビジョンが必要な場合は、次のことができます。

svn info /path/to/your-projects-local-working-copy/.@HEAD | awk '/^Last Changed Rev:/ {print $NF}'
于 2008-10-30T11:44:17.467 に答える
7

この質問の複製。そこに投稿したように、svnversionコマンドはあなたの友達です。出力を解析する必要はなく、最初に更新する必要もありません。ただ仕事をするだけです。

于 2008-10-30T13:59:21.440 に答える
3

MSBuild(Visual Studio)を使用してバイナリをビルドしているかどうかはわかりません。ただし、次の場合は、 MSBuild CommunityTasksProjectを介してSubverionとMSBuildの間に接続が可能です。

ビルドスクリプトの一部は次のとおりです。(C#)アプリケーションはsvnリビジョン番号を取得します。

  <SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="installationpath\of\subversion\bin">
     <Output TaskParameter="Revision" PropertyName="Revision" />
  </SvnVersion>
  <Message Text="Version: $(Major).$(Minor).$(Build).$(Revision)"/>
...
    AssemblyVersion="$(Major).$(Minor).$(Build).$(Revision)"
     AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)"

1月

于 2008-09-11T10:54:47.900 に答える
2

@CharlesMillerと@TroelsArvinによって提供された答えは正しいです-svn updateまたはの出力を使用できますsvn infoが、ヒントとして、後者はリポジトリが最新の場合にのみ機能します。繰り返しになりますが、ソースツリーの一部が別の部分とは異なるリビジョンにある場合、リビジョン番号がどのような値になるかはわかりません。均質な木で作業する必要があるように思えます。infoを実行する前に更新するか(または、ビルド用に既に更新している場合は、ゴールデンです)、またはを使用することをお勧めしますsvn info URL-to-source

于 2008-09-11T11:00:00.413 に答える
2

あなたがやりたいことを正確に行うsvnversionと呼ばれる Subversion と共に配布されるプログラムがあります。それが私たちのウェブサイトにタグを付ける方法です。

于 2008-10-30T14:00:19.520 に答える
1

「svninfo」には、作業コピーのリビジョン番号が表示されます(「svninfo」からの出力の「Revision」行を参照)。ビルドシステムでは、おそらく「svn info」の出力の関連部分を、アプリケーションに反映される場所に配置することができます。たとえば、ビルド時に、「svninfo」からの出力を含む一時的な(バージョン管理されていない)ファイルを作成するように指定できます。次に、コンパイル時にこのファイルを含めます。

于 2008-09-11T10:43:47.597 に答える
1

私にとって、トランク/ブランチの最後のリビジョン番号を見つける最良の方法は、リモート URL から取得することです。作業ディレクトリは廃止される可能性があるため、使用しないことが重要です。ここにバッチのスニペットがあります(私は大嫌いです;-)):

@for /f "tokens=4" %%f in ('svn info %SVNURL% ^|find "Last Changed Rev:"') do set lastPathRev=%%f

echo trunk rev no: %lastPathRev%

それにもかかわらず、$Rev:$ を含むソースに暫定バージョンとしてこの番号をハードコードするのに問題があります。問題は、$Rev:$ にファイル rev が含まれていることです。番号。したがって、トランクのリビジョン番号がバージョン ファイルのリビジョン番号よりも大きい場合は、このファイルを「人為的に」変更し、コミットして正しい中間バージョン (=トランク バージョン) を取得する必要があります。これはペインです!誰かがより良い考えを持っていますか? どうもありがとう

于 2013-01-16T21:46:29.170 に答える
0

これはばかげていsvn infoますが、svnversionサブディレクトリを考慮していません。それは「混合リビジョン」と呼ばれる機能です - 私はそれを拷問と呼んでいます。ライブコードベースの最新の「リビジョン」を見つける必要があり、以下のハッキングされた方法がうまくいきました-実行には時間がかかる場合があります。

repo_root# find ./ | xargs -l svn info  | grep 'Revision: ' | sort
...
Revision: 86
Revision: 86
Revision: 89
Revision: 90
root@fairware:/home/stage_vancity#
于 2012-10-24T20:17:33.760 に答える