使用PHP,Perl或Python(最好是PHP),我需要一种方法来查询SVN数据库并找出发送给SVN的最新修订号。除此之外我不需要任何其他东西。它需要是非密集型的(所以我每隔5分钟就做一次cron工作; SVN的性能不应该受到影响)。
SVN位于我的Intranet上,但不是我的特定计算机。
我安装了SVN,但没有为PHP / Perl / Python安装绑定。我正在运行Windows XP,但我更喜欢独立于平台的解决方案,它也适用于Linux。如果你有一个仅限Linux(或仅限XP)的解决方案,这也会有所帮助。
答案 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
答案 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)
答案 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 info
或svnversion
不会考虑子目录,找到以下黑客方式为我提供的实时代码库的最新“修订版” - 运行可能需要一段时间:< / 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最年轻”也可以远程工作。
答案 25 :(得分:-1)
看起来有an entry in the official FAQ for this。源代码在C中,但同样的原则适用于outlined here in this mailing list post。