获取SVN中的最后一个修订号?

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

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

我安装了SVN,但没有为PHP / Perl / Python安装绑定。 我正在运行Windows XP,但我更喜欢一个独立于平台的解决scheme,也可以在Linux中工作。 如果您只有Linux(或仅限于XP)解决scheme,那也是有帮助的。

 <?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`; 

如果你想分析一个本地工作副本,最好的工具是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 

svn info -r HEAD

这会给你最新的版本号在你的仓库的头。

有关于将颠覆号码集成到您的构build脚本的一些很好的博客文章:

  • 在Ant中获取Subversion版本
  • 在Xcode中自动生成子版本

这应该工作在Bash,从工作目录。 我已经在Windows中使用它与unixutils安装:

 svn info |grep Revision: |cut -c11- 

以下应该工作:

 svnlook youngest <repo-path> 

它返回一个修订版本号。

要真正获得远程存储库上的最新版本(“主版本”),请使用以下命令:

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

输出例如:

 35669 

关于获取最新版本号的说明:

假设我已经修改了一个子目录( 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报告的最低版本!

然后,我们可以在recursion模式下使用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 ),但是,在线path被报告为MyProjectDir (与本地情况相反) – 报告的在线修订是最高的到最低的323报告)。

  • 从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参考 。

我想你正在寻找

 svn info -r HEAD 

你能用这个命令吗?

您可能还需要提供存储库的login凭证。

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

 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 

您可以使用以下任一命令:

 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 

如果你想真的很短:

 svn info ^/ 

插入符号是“存储库根目录的URL”的缩写。

你正在寻找一个类似于命令行调用的调用

 svn info URL 

看来这是可能的使用pysvn库,并有一个食谱 ,应该帮助你开始。 我不确定是否有类似的PHP。

如果您需要自己调用SVN二进制文件,请确保使用--xml参数以XMLforms获得结果。 这应该比命令行输出更容易parsing。

您可以使用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 

只要在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: 

你会从这里得到REVISION

如果您不幸需要从Windowsbatch file中执行此操作,请查看以下咒语:

 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信息”,遍历生成输出的每一行。 它使用冒号作为行上第一个和第二个标记之间的分隔符。 当第一个标记是“Revision”时,它将环境variablesREV设置为第二个标记。

发布的解决scheme不处理外部使用时的情况。

如果我有一个URL或svn:externals属性设置的工作副本,外部可能会改变,因此subversion服务器的最新版本会改变。 但是工作副本或URL的最新版本只会在svn:externals propty发生更改或URLpath中较低的项目(预期行为)时报告修订号。

所以你要么获得svn:externals属性并迭代URL并select高度版本或从Subversion服务器查询基本URL。 从基本URL报告的版本将包含服务器上所有事件的最新版本。

所以,如果你使用的是外部的,最好使用svn info BASE_URL ,其中BASE_URL是Subversion服务器上所有path的根URL。

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

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

我希望这有帮助。

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

最简单和干净的方法来做到这一点(实际上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

svn info或者svnversion不会考虑子目录,为了find下面被黑掉的方式为我工作的实时代码库的最新'修订' – 可能需要一段时间才能运行:

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

你可以尝试下面的命令:

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

看起来在官方FAQ中有一个条目 。 源代码使用C语言,但同样的原则适用,如本邮件列表文章所述 。

更新:Subversion 1.9将支持只输出最新版本号的新命令“svn youngest”。 “svnlook最年轻”的区别在于“svn最年轻”也是远程工作的。

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