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

113

使用PHP、Perl或Python(最好使用PHP),我需要一种查询SVN数据库并查找最后一个发送到SVN的版本号的方法。除此之外,我不需要其他任何内容。它需要是非密集型的(因此我将其设置为每5分钟作为cron作业运行;SVN的性能不应受影响)。

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

我已经安装了SVN,但没有安装PHP / Perl / Python的绑定。我正在运行Windows XP,但我更喜欢一个平台无关的解决方案,也可以在Linux中工作。如果您有仅适用于Linux(或仅适用于XP)的解决方案,那也会很有帮助。


3
"svn info --show-item revision" 命令将显示当前目录所更新的最新版本。 - GreatAndPowerfulOz
2
$ svn info --show-item revision svn: 无效选项: --show-item 使用 Apache Subversion 1.8.16 (r1740329) 编译于 2016 年 4 月 26 日。也尝试使用 CollabNet 1.6.11 (r934486) 编译于 2014 年 3 月 6 日。 - IceArdor
关于这些评论,请查看 svn help info 以获取 svn info 的合法选项。 - XavierStuvw
@IceArdor 我正在使用 SVN v1.9.5,--show-item 可用。 - icc97
26个回答

134
如果你想分析一个本地的工作副本,最好的工具是svnversion,它随着Subversion一起提供,并生成像968:1000M这样的输出。文档如下所述:
“如果工作副本是单个修订版本、未修改、未切换且具有与TRAIL_URL参数匹配的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 info好多了。 - Richard
33
svnversion 适用于本地工作副本,不会访问内部网络中指定的仓库。 - Daniel X Moore
6
对于不熟悉 svnversion 的人来说,它是标准命令行客户端的一部分,这里是手册页面链接:http://svnbook.red-bean.com/nightly/en/svn.ref.svnversion.re.html。 - Michael Sorens

73
<?php
    $url = 'your repository here';
    $output = `svn info $url`;
    echo "<pre>$output</pre>";
?>

你可以像这样获取XML输出:

$output = `svn info $url --xml`;
如果出现错误,输出将被定向到 stderr。要捕获标准错误并将其包含在输出中,请使用以下命令:
$output = `svn info $url 2>&1`;

2
如果出现错误,则输出将被重定向到stderr。要在您的输出中捕获stderr,请使用以下方式:$output = svn info $url 2>&1; - Daniel X Moore
3
谢谢!我使用--xml来构建自己的C#工具,帮助我生成AssemblyFileVersion属性。PS:英语不是我的母语,我被从未听过的单词“thusly”困惑了。顺便说一下,它的起源相当有趣:参考(http://en.wiktionary.org/wiki/thusly); 你是有意使用它(双关语?)还是通常使用thusly而不是thus? - odalet
7
svn info $url | grep 'Last Changed Rev' | awk '{ print $4; }' - Cobra_Fast
7
@Cobra_Fast,您不需要使用管道符号,可以使用svn info --show-item revision $url或者svn info --show-item last-changed-revision $url命令。 - cp.engr
2
@cp.engr 我相信这只是从 SVN v1.9 开始的 - 我在 v1.9.5 中有它,而在 v1.8.6 中它不存在。 - icc97
显示剩余2条评论

51

这是最简单的方法,因为您不必先找出存储库的URL。谢谢! - derFunk
我在使用引号包围HEAD时遇到了错误,所以应该只是svn info -r HEAD - icc97

39

这应该在Bash中工作,从一个有效的目录开始。我已经在Windows上使用了它,并安装了unixutils

svn info |grep Revision: |cut -c11-

1
注意:由于缺少-rHEAD,这将返回所请求的文件或目录的提交版本。这可能不是最新的总体修订版(因为其他更改可能已在其他地方或子树中提交)。 - Mr Fooz
4
此外,这种方法不适用于本地化版本的SVN(在波兰语中应该是|cut -c9-)。 - zgoda
2
这就是我强烈不喜欢本地化命令行开发工具的原因:零优势,一堆问题。出于这个原因,我通常会删除本地化设置。 - gimpf
8
将分隔符传递而不是字符计数对本地化内容最有效,例如svn info | grep Revision | cut -d " " -f 2将返回在使用空格拆分后的第二个字符串。 - Butifarra
仅使用“svn info --show-item revision”命令将只提供当前版本号。 - GreatAndPowerfulOz
显示剩余4条评论

37
以下代码应该可以正常运行:
svnlook youngest <repo-path>

它返回一个单一的版本号。


18

要获取你的远程代码库的最新修改版本(“head版本”)号码,请使用以下命令:

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

输出示例:

35669

13

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

假设我已经进入了一个有版本控制的子目录(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)。


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

svn info --show-item=revision <URL-to-repository>
  • 使用--xml选项获取svn info的XML格式输出,并使用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 参考


  • 这是最好的答案 - undefined

    7
    我认为您正在寻找的是:
    svn info -r HEAD
    

    你能运行那个命令吗?

    很可能你还需要提供与代码库相关的登录凭证。


    我认为需要使用 svn info -r HEAD。 - Stephen
    -r 可以很容易地被省略。 - ypnos
    没错 - 我没有为-r指定选项 - 这只是为了让他找到所需的内容并开始使用帮助/书籍。 - Tim

    4

    有人比我更快地发表了关于svnversion的答案,如果你有一个工作副本,这绝对是最好的解决方案(如果我没记错,它不能用于URL)。我要补充一下:如果你在托管SVN的服务器上,最好的方法是使用svnlook命令。当编写钩子脚本以检查存储库时(甚至在提交前的钩子事务中),您可以使用此命令。您可以键入svnlook help获取详细信息。您可能希望使用svnlook youngest命令。请注意,它需要直接访问repo目录,因此必须在服务器上使用。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接