SVNの最後のリビジョン番号を取得していますか?


103

PHP、Perl、またはPython(できればPHP)を使用して、SVNデータベースを照会し、SVNに送信された最後のリビジョン番号を調べる方法が必要です。それ以外は必要ありません。非集中的である必要があります(したがって、私はcronジョブとして5分ごとに実行します。SVNのパフォーマンスは影響を受けません)。

SVNは私のイントラネットにありますが、特定のコンピューターにはありません。

SVNがインストールされていますが、PHP / Perl / Python用のバインディングがインストールされていません。私はWindows XPを実行していますが、Linuxでも機能する、プラットフォームに依存しないソリューションを好みます。Linuxのみ(またはXPのみ)のソリューションがある場合は、それも役立ちます。


2
「svn info --show-item revision」は、現在のディレクトリが更新される現在のリビジョンを提供します。
GreatAndPowerfulOz

1
$ svn info --show-item revision svn: invalid option: --show-itemApache Subversion 1.8.16(r1740329)を使用して2016年4月26日にコンパイルされました。また、2014
試されました。– IceArdor

これらのコメントに関連して、チェックアウトするsvn help infoための有効なオプションのためにsvn info
XavierStuvw

@IceArdor私はSVN v1.9.5を--show-item使用していて、利用可能です
icc97

回答:


68
<?php
    $url = 'your repository here';
    $output = `svn info $url`;
    echo "<pre>$output</pre>";
?>

次のようにXMLで出力を取得できます。

$output = `svn info $url --xml`;

エラーがある場合、出力はstderrに送られます。stderrを出力に取り込むには、次のように使用します。

$output = `svn info $url 2>&1`;

2
エラーがある場合、出力はstderrに送られます。stderrを出力にキャプチャするには、次のように使用します。$ output = svn info $url 2>&1;
ダニエルXムーア

3
ありがとう!--xmlを使用して、AssemblyFileVersion属性の生成に役立つ独自のC#ツールを作成しました。PS:英語は私の第一言語ではないので、これまで聞いたことのない「このように」という言葉に戸惑いました。ところで、その起源はかなりおかしいです:cf(en.wiktionary.org/wiki/thusly); 意図的にそれを使用しましたか(しゃれましたか?)または代わりにこうして使用するのが一般的ですか?
odalet 2013

7
svn info $url | grep 'Last Changed Rev' | awk '{ print $4; }'
Cobra_Fast 2013年

7
@Cobra_Fast、パイプする必要はありません、svn info --show-item revision $urlまたはを実行できますsvn info --show-item last-changed-revision $url
cp.engr 2016

2
@ cp.engrこれはSVN v1.9からのみだと思います-つまり、私はそれをv1.9.5に持っていて、v1.8.6には存在しません
icc97

131

ローカルの作業コピーを分析する場合、最適なツールはですsvnversion。これはSubversionに付属しており、のような出力を生成します968:1000M。ドキュメントは言う:

作業コピーが単一リビジョンで、変更されておらず、切り替えられておらず、URLがTRAIL_URL引数と一致する場合、バージョン番号は単一の番号になります。作業コピーが異常な場合、バージョン番号はより複雑になります。

4123:4168     mixed revision working copy
4168M         modified working copy
4123S         switched working copy
4123:4168MS   mixed revision, modified, switched working copy

2
同意、svn infoよりはるかに良い
Richard

32
svnversionはローカルの作業用コピーであり、質問で指定されているイントラネット上のリポジトリにはアクセスしません。
Daniel X Moore

5
svnversionに慣れていない人のために、それは標準のコマンドラインクライアントの一部であり、これはマニュアルページです:svnbook.red-bean.com/nightly/en/svn.ref.svnversion.re.html
Michael Sorens、

45

svn info -r HEAD

これにより、リポジトリの先頭にある最新のリビジョン番号がわかります。

ビルドスクリプトにsubversion番号を統合する方法については、すばらしいブログ投稿があります。


最初にリポジトリのURLを見つける必要がないため、これが最も簡単な方法です。ありがとう!
derFunk 2013年

HEADの前後で引用符を使用するとエラーが発生したので、エラーになるはずですsvn info -r HEAD
icc97

38

これは、作業ディレクトリから、Bashで動作するはずです。unixutilsがインストールされているWindowsで使用しました。

svn info |grep Revision: |cut -c11-

リポジトリURLを%*がある場所に置くと、その意味が何であれ、機能します。前にそれを知らなかったカットの素晴らしい構文。
ypnos 2009

1
注:これには-rHEADがないため、要求されたファイルまたはディレクトリのコミットリビジョンを返します。これは最新の全体的なリビジョンではない可能性があります(他の変更が他の場所またはサブツリーでコミットされた可能性があるため)。
Fooz氏、2009

4
また、これはSVNのローカライズ版では機能しません(ポーランド語では、これは|カット-c9-になります)。
zgoda 2009

2
それが、ローカライズされたコマンドライン開発者ツールを強く嫌う理由です。ゼロの利点、問題の束。私は通常、この理由でローカライズを削除します。
gimpf 2010年

7
文字数の代わりに区切り文字を渡すと、ローカライズされたコンテンツに最適です。たとえば、svn info | grep Revision | cut -d " " -f 2スペースを使用して分割された後、2番目の文字列が返されます。
ブティファラ

34

以下はうまくいくはずです:

svnlook youngest <repo-path>

単一のリビジョン番号を返します。


15

リモートリポジトリの最新リビジョン(「ヘッドリビジョン」)番号を実際に取得するには、次のコードを使用します。

svn info -r 'HEAD' | grep Revision | egrep -o "[0-9]+"

出力例:

35669

12

最新のリビジョン番号の取得に関する注意:

私がきたと言うcdrevisionedサブディレクトリに-ed( MyProjectDir)。次に、私が電話するとsvnversion

$ svnversion .
323:340

... " 323:340" が表示されます。これは、 " リビジョン323から340までのアイテムがここにあることを意味します"になります

 

次に、私が電話するとsvn info

$ svn info
Path: .
URL: svn+ssh://server.com/path/to/MyProject/MyProjectDir
Repository Root: svn+ssh://server.com/path/to/MyProject
Repository UUID: 0000ffff-ffff-...
Revision: 323
Node Kind: directory
Schedule: normal
Last Changed Author: USER
Last Changed Rev: 323
Last Changed Date: 2011-11-09 18:34:34 +0000 (Wed, 09 Nov 2011)

...「323」をリビジョンとして取得します-これは実際にによって報告されたものの中で最も低いリビジョンsvnversionです。

 

その後svn info、再帰モードで使用して、ローカルディレクトリから詳細情報を取得できます。

> svn info -R | grep 'Path\|Revision'
Path: .
Revision: 323
Path: file1.txt
Revision: 333
Path: file2.txt
Revision: 327
Path: file3.txt
Revision: 323
Path: subdirA
Revision: 328
Path: subdirA/file1.txt
Revision: 339
Path: subdirA/file1.txt
Revision: 340
Path: file1.txt
Revision: 323
...

...(grep詳細を表示するにはを削除してください)。

 

最後に、オンラインリポジトリの最新リビジョン(この場合は@ server.com)を確認したい場合はどうすればよいですか?次に、もう一度を発行svn infoしますが、-r HEAD-R以前の資本オプションと-r現在の小文字の違いに注意してください):

> svn info -r 'HEAD'
USER@server.com's password:
Path: MyProjectDir
URL: svn+ssh://server.com/path/to/MyProject/MyProjectDir
Repository Root: svn+ssh://server.com/path/to/MyProject
Repository UUID: 0000ffff-ffff-...
Revision: 340
Node Kind: directory
Last Changed Author: USER
Last Changed Rev: 340
Last Changed Date: 2011-11-11 01:53:50 +0000 (Fri, 11 Nov 2011)

興味深いのは- svn info現在のサブディレクトリ(MyProjectDir)を参照していますが、オンラインパスはMyProjectDir.ローカルの場合とは対照的に)報告されており、報告されたオンラインリビジョンは最高です340- 323報告された最低のものとは対照的です)ローカルで)。


9
  • Subversion 1.9以降では、オプション--show-itemを使用して、svn infoコマンドの出力のいずれかのフィールドの値を取得できます。このコマンドはリビジョン番号のみを表示します:

    svn info --show-item=revision <URL-to-repository>
    
  • --xmlオプションを使用してsvn infoのXML出力を取得し、PowerShellを使用してリビジョン番号を取得します。以下に簡単な例を示します。

    [xml]$svninfo = svn info <REPOSITORY-URL> --xml -r HEAD
    $latestrevnum = $svninfo.info.entry.revision
    $latestrevnum
    
  • VisualSVNサーバー3.4以降を使用して、次のコマンドを実行することにより、リポジトリ内のリビジョン数を取得できます。

    $repo = Get-SvnRepository <REPOSITORY-NAME>

    $repo.Revisions

    詳細については、Get-SvnRepositoryPowerShellコマンドレットリファレンスをご覧ください。


7

あなたが探していると思います

svn info -r HEAD

そのコマンドにシェルできますか?

おそらく、リポジトリにもログイン認証情報を提供する必要があります。


svn info -r HEAD
Stephen

-rは簡単に省略できます。
ypnos 2009

右-私は-rのオプションを指定しませんでした-これは、彼が必要なものを見つけてヘルプ/ブックを使い始めるためのものでした。
ティム

4

他の誰かがについての回答を投稿して私を打ち負かしましたsvnversion。これは、作業コピー(IIRC、URLでは機能しません)を持っている場合、間違いなく最良の解決策です。これを追加します。SVNをホストしているサーバー上にいる場合は、svnlookコマンドを使用するのが最善の方法です。これは、リポジトリ(およびプリコミットフックの場合は現在のトランザクション)を検査するフックスクリプトを記述するときに使用するコマンドです。svnlook help詳細を入力できます。おそらくsvnlook youngestコマンドを使いたいでしょう。repoディレクトリに直接アクセスする必要があるため、サーバーで使用する必要があることに注意してください。


2
nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svnversion
12354

または

nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml |     xmlstarlet sel -t --value-of "//entry/@revision"
12354

または

nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml | xmlstarlet sel -t --value-of "//commit/@revision"
12335

2

次のいずれかのコマンドを使用できます。

1)
> svn info | awk '/Revision:/ { print $2 }' =>returns the latest version


2)
> svn log -l 1 | grep '^r[0-9]\+' | awk '{print $1}'

svn log -l 1     => returns the latest version commit 
grep '^r[0-9]\+' => greps the r4324 (revision) number
awk '{print $1}' => prints the match found


2

Windowsバッチファイルからこれを行う必要があるという不幸がある場合は、ここにあなたが探している呪文があります:

set REV=unknown
for /f "usebackq tokens=1,2 delims=: " %%A in (`svn info`) do if "%%A" == "Revision" set REV=%%B
echo Current SVN revision is %REV%

これは「svn info」を実行し、生成された出力の各行を繰り返します。行の最初のトークンと2番目のトークンの間の区切り文字としてコロンを使用します。最初のトークンが「リビジョン」の場合、環境変数REVを2番目のトークンに設定します。


1
あなたにもFINDSTRを使用することができますFOR /F "tokens=2" %%i IN ('svn info ^| FINDSTR Revision:') DO SET revision=%%i
icc97

これの根拠については、この別のSO回答を参照してください
icc97

2

コマンドライン呼び出しに似た呼び出しを探しています

svn info URL

これはpysvnライブラリーを使用して可能であるように思われ、始めるのに役立つはずのレシピがあります。PHPに同様のものがあるかどうかはわかりません。

自分でSVNバイナリを呼び出す必要がある場合は、--xmlパラメータを使用して結果をXMLとして取得してください。コマンドラインの出力よりも解析が簡単です。


subprocess.check_outputさらに別のライブラリ呼び出しを回避するために、Pythonで使用しています。リビジョン番号を確認したり、最新のコピーを削除したりする場合は、コマンドラインからを介してsvnを使用する方が簡単subprocessです。自動チェックインとマージを実行している場合...
Droogans '26

2

たとえば、XML出力形式を使用できます。

  svn info --xml | grep 'revision' | head -1 | grep -Eo "[0-9]+" | xargs expr -1 +

例:リビジョン番号を使用する

working=`svn info --xml | grep 'revision' | head -1 | grep -Eo "[0-9]+" | xargs expr -1 +`
svn diff -r $working:HEAD --summarize --xml

2

以下のコマンドを試すことができます:

svn info -r 'HEAD' | grep Revision: | awk -F' ' '{print $2}'

1

ちょうどsvn infoBASHであなたにすべての詳細を与えます

RESULT:
Path: .
URL: 
Repository Root: 
Repository UUID: 
Revision: 54
Node Kind: directory
Schedule: normal
Last Changed Author: 
Last Changed Rev: 54
Last Changed Date: 

これからREVISIONを取得します


1

これを行う最も簡単でクリーンな方法(実際には2015年にリリースされたsvn 1.9)は、以下を使用しています。

svn info --show-item revision [--no-newline] [SVNURL/SVNPATH] 

出力は、SVNURL の最後のリビジョン(最上位)の番号、またはSVNPATH の作業コピーの現在のリビジョンの番号です。--no-newline任意であるが、指示svn(化粧改行を放出しない\nあなたは最小限の出力(のみリビジョン番号)が必要な場合は、値の後に)。

参照:https : //subversion.apache.org/docs/release-notes/1.9.html#svn-info-item


1
私はsvn 1.9.3を試しましたがsvn info --show-item、ここでのコマンドはの代わりに--show item
elopio

0

投稿されたソリューションは、外観が使用されている場合のケースを処理しません。

私がURLまたは作業コピーを持っている場合 svn:externalsプロパティセットが設定され場合、外観が変更される可能性があるため、Subversionサーバーの最新リビジョンが変更されます。しかし、作業コピーまたはURLの最新のリビジョンは、svn:externalsプロパティが変更された場合、またはURLパスの下位のアイテムである場合にのみ、リビジョン番号を報告します。これは予想される動作です。

だからあなたはどちらかを得る svn:externalsプロパティをしてURLを反復処理して高さのリビジョンを選択するか、SubversionサーバーからベースURLをクエリします。ベースURLから報告されるバージョンには、サーバー上のすべての最新リビジョンが含まれます。

したがって、外部を使用しているsvn info BASE_URL場合BASE_URLは、subversionサーバー上のすべてのパスのルートURL がどこにあるかを使用するのが最善です。


0

これは最後に変更されたリビジョンのリビジョン番号のみを取得します:

<?php
$REV="";
$repo = ""; #url or directory
$REV = svn info $repo --show-item last-changed-revision;
?>

これがお役に立てば幸いです。


0

$ svn log | head -10.svnフォルダー がある任意のディレクトリ


0

svn infoまたはsvnversionサブディレクトリを考慮せず、以下のハッキングされた方法が私のために働いたライブコードベースの最新の「リビジョン」を見つけるために-実行するのにしばらく時間がかかるかもしれません:

repo_root$ find ./ | xargs -l svn info  | grep 'Revision: ' | sort
...
Revision: 86
Revision: 86
Revision: 89
Revision: 90
$

0

これは、「SVN」ライブラリを使用して取得できます。

import svn.remote

file_path = "enter your filepath"

svn_inf = svn.remote.RemoteClient(file_path)

head_revision = ([x for x in svn_inf.log_default(revision_to = 'HEAD')] [-1]).revision

head_revisionには、ファイルの最新のリビジョン番号を含める必要があります



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.