获取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最年轻”也是远程工作的。