获取SVN中的最新修订号?

时间:2009-02-23 20:29:30

标签: svn

使用PHP,Perl或Python(最好是PHP),我需要一种方法来查询SVN数据库并找出发送给SVN的最新修订号。除此之外我不需要任何其他东西。它需要是非密集型的(所以我每隔5分钟就做一次cron工作; SVN的性能不应该受到影响)。

SVN位于我的Intranet上,但不是我的特定计算机。

我安装了SVN,但没有为PHP / Perl / Python安装绑定。我正在运行Windows XP,但我更喜欢独立于平台的解决方案,它也适用于Linux。如果你有一个仅限Linux(或仅限XP)的解决方案,这也会有所帮助。

26 个答案:

答案 0 :(得分:126)

如果您想分析本地工作副本,最好的工具是svnversion,它附带Subversion并生成类似968:1000M的输出。文档说:

  

版本号将是一个   如果工作副本是单个的,则为number   修改,未修改,未切换和   使用与之匹配的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

答案 1 :(得分:66)

<?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 :(得分:44)

  

svn info -r HEAD

这将为您提供存储库头部的最新修订号。

有一些关于将subversion数字集成到构建脚本中的好文章:

答案 3 :(得分:35)

这应该在Bash中从工作目录中运行。我已在安装了unixutils的Windows中使用它:

svn info |grep Revision: |cut -c11-

答案 4 :(得分:33)

以下内容应该有效:

svnlook youngest <repo-path>

它返回一个修订号。

答案 5 :(得分:13)

要真正获取远程存储库中的最新版本(“头部修订版”)编号,请使用以下命令:

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

输出例如:

35669

答案 6 :(得分:12)

关于获取最新修订号的说明:

说我cd - 在修订的子目录(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

答案 7 :(得分:8)

  • 从Subversion 1.9开始,您可以使用选项--show-item来获取svn info命令输出字段之一的值。此命令仅显示修订号:

    svn info --show-item=revision <URL-to-repository>
    
  • 使用--xml选项获取svn info的XMLed输出,并使用PowerShell获取修订号。这是一个简单的例子:

    [xml]$svninfo = svn info <REPOSITORY-URL> --xml -r HEAD
    $latestrevnum = $svninfo.info.entry.revision
    $latestrevnum
    
  • 使用VisualSVN Server 3.4或更高版本,您可以通过运行以下命令获取存储库中的修订数量:

    $repo = Get-SvnRepository <REPOSITORY-NAME>

    $repo.Revisions

    有关详细信息,请参阅Get-SvnRepository PowerShell cmdlet reference

答案 8 :(得分:6)

我认为你在寻找

svn info -r HEAD

你可以使用该命令吗?

您可能还需要提供存储库的登录凭据。

答案 9 :(得分:4)

其他人打败我发布关于svnversion的答案,如果您有工作副本(IIRC,它不适用于URL),这绝对是最佳解决方案。我将补充一点:如果您在托管SVN的服务器上,最好的方法是使用svnlook命令。这是在编写钩子脚本以检查存储库时使用的命令(在预提交钩子的情况下甚至是当前事务)。您可以输入svnlook help了解详细信息。您可能想要使用svnlook youngest命令。请注意,它需要直接访问repo目录,因此必须在服务器上使用它。

答案 10 :(得分: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

答案 11 :(得分:2)

您可以尝试以下命令:

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

答案 12 :(得分:2)

如果你想要一个很短的一个:

svn info ^/

caret notation是“存储库根目录的URL”的简写。

答案 13 :(得分: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

答案 14 :(得分: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

答案 15 :(得分:2)

您正在寻找类似于命令行调用的电话

svn info URL

似乎可以使用pysvn库实现这一点,并且a recipe可以帮助您入门。我不确定PHP是否有类似内容。

如果您需要自己调用SVN二进制文件,请确保使用--xml参数将结果作为XML。这应该比命令行输出更容易解析。

答案 16 :(得分:1)

BASH中的svn info将为您提供所有详细信息

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

您将从此处获得修订

答案 17 :(得分:1)

如果你不幸需要从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”,遍历每行生成的输出。它使用冒号作为行上第一个和第二个标记之间的分隔符。当第一个标记是“Revision”时,它将环境变量REV设置为第二个标记。

答案 18 :(得分:0)

最简单干净的方法(实际上是svn 1.9,2015年发布)正在使用:

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

输出是SVNURL的最后修订版(joungest)的编号, 或SVNPATH工作副本的当前版本的编号。 --no-newline是可选的,指示svn在值之后不发出化妆品换行符(\n),如果您需要最小输出(仅限修订号)。

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

答案 19 :(得分:0)

当使用外部时,发布的解决方案无法处理。

如果我有一个带有svn:externals属性集的URL或工作副本,则外部可能会发生变化,因此subversion服务器的最新版本将会更改。但是,工作副本或URL的最新版本仅在svn:externals propty更改时报告修订号,或者URL路径中的任何项目更低,这是预期的行为。

因此,您要么获得svn:externals属性并迭代URL并选择高度修订版本,要么从subversion服务器查询基本URL。从基本URL报告的版本将包含服务器上的所有内容的最新版本。

因此,如果您使用的是外部,最好使用svn info BASE_URL,其中BASE_URL是 subversion服务器上所有路径的根URL。

答案 20 :(得分:0)

这将只获得上次更改版本的修订号:

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

我希望这会有所帮助。

答案 21 :(得分: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应该包含文件的最新修订号

答案 22 :(得分:0)

$ svn log | head -10 在任何具有.svn文件夹的目录

答案 23 :(得分:0)

svn infosvnversion不会考虑子目录,找到以下黑客方式为我提供的实时代码库的最新“修订版” - 运行可能需要一段时间:< / p>

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

答案 24 :(得分:-1)

更新:Subversion 1.9将支持一个新命令“svn youngest”,它只输出最新版本号。 “svnlook最年轻”的不同之处在于“svn最年轻”也可以远程工作。

http://subversion.tigris.org/issues/show_bug.cgi?id=4299

答案 25 :(得分:-1)

看起来有an entry in the official FAQ for this。源代码在C中,但同样的原则适用于outlined here in this mailing list post