获取SVN中的最新修订版本号?


103

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

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

我已经安装了SVN,但是没有为PHP / Perl / Python安装任何绑定。我正在运行Windows XP,但是我希望使用一个与平台无关的解决方案,该解决方案也可以在Linux中使用。如果您具有仅Linux(或仅XP)解决方案,那也将有所帮助。


2
“ svn info --show-item版本”将给出当前目录更新到的当前版本。
GreatAndPowerfulOz

1
$ svn info --show-item revision svn: invalid option: --show-item使用Apache Subversion 1.8.16(r1740329)于2016年4月26日编译。还尝试与CollabNet 1.6.11(r934486)于2014
。– IceArdor

关于这些评论,请查看svn help info有关svn info
XavierStuvw

@IceArdor我正在使用SVN v1.9.5,并且--show-item可以使用
icc97 '17

Answers:


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;
Daniel X Moore

3
谢谢!我使用--xml构建了自己的C#工具,该工具可以帮助我生成AssemblyFileVersion属性。PS:英语不是我的主要语言,我对以前从未听说过的“如此”一词感到困惑。顺便说一句,它的起源很有趣:cf(en.wiktionary.org/wiki/thusly); 您是否故意使用它(双关语)?还是通常使用它而不是这样使用它?
odalet

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

7
@Cobra_Fast,不需要管道,可以执行svn info --show-item revision $urlsvn info --show-item last-changed-revision $url
cp.engr '16

2
@ cp.engr我相信这仅是因为SVN v1.9左右-那就是我在v1.9.5中拥有它,而在v1.8.6中不存在
icc97 '17

131

如果要分析本地工作副本,最好的工具是svnversionSubversion附带的工具,它会产生类似的输出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信息要好得多
理查德(Richard)2010年

32
svnversion用于本地工作副本,不会按照问题中的说明访问Intranet上的存储库。
Daniel X Moore

5
对于不熟悉svnversion的用户来说,它是标准命令行客户端的一部分,下面是手册页:svnbook.red-bean.com/nightly/en/svn.ref.svnversion.re.html
迈克尔·索伦斯


38

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

svn info |grep Revision: |cut -c11-

如果将存储库URL放在%*所在的位置(无论您的意思是什么),它都可以工作。不错的cut语法,以前不知道。
ypnos

1
注意:由于缺少-rHEAD,因此将返回所请求文件或目录的提交修订。这可能不是最新的整体修订版(因为可能已在其他位置或子树中提交了其他更改)。
福兹先生09年

4
同样,这对于SVN的本地化版本也不起作用(在波兰语中,它应该是| cut -c9-)。
zgoda

2
顺便说一句,我强烈不喜欢本地化命令行开发人员工具的原因;零优势,一堆问题。出于这个原因,我通常会删除本地化版本。
gimpf 2010年

7
传递定界符而不是字符计数最适合于本地化内容,例如,svn info | grep Revision | cut -d " " -f 2使用空格分割后,将返回第二个字符串。
Butifarra 2012年

34

以下应该工作:

svnlook youngest <repo-path>

它返回一个修订号。


15

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

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

输出例如:

35669

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报告为本地)。


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

    svn info --show-item=revision <URL-to-repository>
    
  • 使用--xml选项获取svn信息的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-SvnRepositoryPowerShell cmdlet参考


7

我想你在找

svn info -r HEAD

您可以使用该命令吗?

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


我认为这应该是svn info -r HEAD
斯蒂芬

-r可以很容易地被忽略。
ypnos

是的-我没有为-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信息”,遍历生成的输出的每一行。它使用冒号作为该行上第一个标记和第二个标记之间的定界符。当第一个标记为“修订”时,它将环境变量REV设置为第二个标记。


1
您也可以使用FINDSTR:FOR /F "tokens=2" %%i IN ('svn info ^| FINDSTR Revision:') DO SET revision=%%i
icc97 2014年

看到其他基于此的答案
icc97 2014年

2

您正在寻找与命令行呼叫类似的呼叫

svn info URL

似乎可以使用pysvn库,并且有一个食谱可以帮助您入门。我不确定PHP是否也有类似的东西。

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


subprocess.check_output在python中使用以避免再次发生库调用。如果您只是查看修订号/提取最新副本,则通过来从命令行使用svn更简单subprocess。现在,如果您正在执行自动签入和合并...
Droogans

2

您可以使用XML out格式,例如:

  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: 

您将从这里获得修订


1

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

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

使用外部组件时,发布的解决方案无法解决问题。

如果我具有svn:externals设置了属性的URL或工作副本,则外部元素可能会更改,因此Subversion服务器的最新版本也会更改。但是,工作副本或URL的最新修订版仅在svn:externals属性更改或URL路径中任何较低项时才报告修订版号,这是预期的行为。

因此,您可以获取svn:externals属性并遍历URL并选择高度修订,或从Subversion服务器中查询基本URL。从基本URL报告的版本将包含服务器上所有内容的最新版本。

因此,如果您使用外部组件,则最好使用svn info BASE_URLwhere 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 infosvnversion不考虑子目录,以下面的hacked方式为我找到实时代码库的最新“修订”,对我来说,这可能需要一段时间才能运行:

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应该包含文件的最新修订号



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.