获取 SVN 中的最新修订号?

Posted

技术标签:

【中文标题】获取 SVN 中的最新修订号?【英文标题】:Getting the last revision number in SVN? 【发布时间】:2010-10-09 09:58:27 【问题描述】:

使用 php、Perl 或 Python(最好是 PHP),我需要一种方法来查询 SVN 数据库并找出发送给 SVN 的最新修订号。我不需要除此之外的任何东西。它需要是非密集的(所以我每 5 分钟执行一次 cron 作业;不应影响 SVN 的性能)。

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

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

【问题讨论】:

"svn info --show-item revision" 将给出当前目录更新到的当前版本。 $ 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 年 3 月 6 日。 关于这些 cmets,请查看 svn help info 以获取 svn info 的法律选项 @IceArdor 我使用的是 SVN v1.9.5,--show-item 可用 【参考方案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好多了 svnversion 用于本地工作副本,不会访问问题中指定的 Intranet 上的存储库。 对于那些不熟悉 svnversion 的人,它是标准命令行客户端的一部分,这里是手册页:svnbook.red-bean.com/nightly/en/svn.ref.svnversion.re.html【参考方案2】:
<?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`;

【讨论】:

如果有错误,那么输出将被定向到stderr。要在输出中捕获 stderr,请使用: $output = svn info $url 2&gt;&amp;1; 谢谢!我使用 --xml 来构建我自己的 C# 工具,该工具可以帮助我生成 AssemblyFileVersion 属性。 PS:英语不是我的主要语言,我对以前从未听过的“thusly”这个词感到困惑。顺便说一句,它的起源相当有趣:cf (en.wiktionary.org/wiki/thusly);你是故意使用它(双关语?)还是你经常使用因此而不是这样? svn info $url | grep 'Last Changed Rev' | awk ' print $4; ' @Cobra_Fast,你不需要管道,你可以做svn info --show-item revision $urlsvn info --show-item last-changed-revision $url @cp.engr 我相信这只是因为 SVN v1.9 左右 - 那是我在 v1.9.5 中有它,它在 v1.8.6 中不存在【参考方案3】:

svn info -r HEAD

这将为您提供存储库头部的最新修订号。

有一些关于将颠覆号集成到构建脚本中的不错的博客文章:

Getting Subversion Revision in Ant Automatic Build Sub-Versioning in Xcode

【讨论】:

这是最简单的方法,因为您不必先找出存储库 url。谢谢! 我在 HEAD 周围使用引号时出错,所以它应该只是 svn info -r HEAD【参考方案4】:

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

svn info |grep Revision: |cut -c11-

【讨论】:

如果你把存储库 URL 放在你有 %* 的地方,不管你的意思是什么。不错的cut语法,以前不知道。 注意:由于缺少 -rHEAD,这将返回所请求文件或目录的提交修订。这可能不是最新的整体修订(因为其他更改可能已在其他地方或子树中提交)。 另外,这不适用于 SVN 的本地化版本(波兰语应为 |cut -c9-)。 也就是说,顺便说一句,我强烈不喜欢本地化命令行开发工具的原因;零优势,一堆问题。正是出于这个原因,我通常会删除本地化。 传递分隔符而不是字符数最适合本地化内容,例如svn info | grep Revision | cut -d " " -f 2 将返回使用空格分割后的第二个字符串。【参考方案5】:

以下应该有效:

svnlook youngest <repo-path>

它返回一个单一的修订号。

【讨论】:

【参考方案6】:

要真正获取 remote 存储库中的最新版本(“head revision”)编号,请使用:

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

例如输出:

35669

【讨论】:

【参考方案7】:

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

假设我在修订后的子目录 (MyProjectDir) 中添加了 cd-ed。那么,如果我打电话给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 以查看更多详细信息)。

 

最后,当我们想要检查online 存储库的最新版本时该怎么办(在本例中为@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 在本地报告)。

【讨论】:

【参考方案8】:

从 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 &lt;REPOSITORY-NAME&gt;

$repo.Revisions

更多信息请参见Get-SvnRepository PowerShell cmdlet reference。

【讨论】:

【参考方案9】:

我想你正在寻找

svn info -r HEAD

你能shell到那个命令吗?

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

【讨论】:

我觉得应该是svn info -r HEAD -r 可以很容易地被省略。 对 - 我没有为 -r 指定选项 - 这只是为了让他找到他需要的东西并开始使用帮助/书籍。【参考方案10】:

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

【讨论】:

【参考方案11】:

最简单和干净的方法(实际上是 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 1.9.3上试过,这里的命令是svn info --show-item,而不是--show item【参考方案12】:
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

【讨论】:

【参考方案13】:

如果你想要很短的:

svn info ^/

caret notation 是“存储库根目录的 URL”的简写。

【讨论】:

【参考方案14】:

如果您不幸需要从 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 设置为第二个标记。

【讨论】:

您也可以使用 FINDSTR:FOR /F "tokens=2" %%i IN ('svn info ^| FINDSTR Revision:') DO SET revision=%%i 查看其他 SO answer 了解此内容的基础【参考方案15】:

您正在寻找类似于命令行调用的调用

svn info URL

使用 pysvn 库似乎可以做到这一点,a recipe 应该可以帮助您入门。我不确定PHP是否有类似的东西。

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

【讨论】:

我在 python 中使用subprocess.check_output 来避免另一个库调用。如果您只是检查修订号/下载最新副本,则只需通过subprocess 从命令行使用 svn 就更简单了。现在,如果您要进行自动签入和合并...【参考方案16】:

您可以使用任一命令:

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

【讨论】:

【参考方案17】:

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: 

您将从这里获得修订版

【讨论】:

【参考方案18】:

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

【讨论】:

【参考方案19】:

你可以试试下面的命令:

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

【讨论】:

【参考方案20】:

发布的解决方案无法处理使用外部设备时的情况。

如果我有一个带有svn:externals 属性集的URL 或工作副本,外部可能会改变,因此颠覆服务器的最新版本也会改变。但是,工作副本或 URL 的最新版本只会在 svn:externals 属性发生更改或 URL 路径中任何较低的项目时报告修订号,这是预期的行为。

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

所以,如果您使用外部,最好使用svn info BASE_URL,其中BASE_URL 是 颠覆服务器上所有路径的根 URL。

【讨论】:

【参考方案21】:

这将只获得最后更改的修订版的修订号:

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

我希望这会有所帮助。

【讨论】:

【参考方案22】:

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

【讨论】:

【参考方案23】:

svn infosvnversion 不会考虑子目录,要找到实时代码库的最新“修订版”,下面的黑客方式对我有用 - 可能需要一段时间才能运行:

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

【讨论】:

【参考方案24】:

这可以使用 "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 应该包含文件的最新版本号

【讨论】:

【参考方案25】:

看起来有an entry in the official FAQ for this。源代码是 C 语言,但原理相同,如 outlined here in this mailing list post。

【讨论】:

这是一个很棒的工具/答案,但我不认为他需要那么多 - 我理解它只是需要最新的修订版,所以如果他当前的修订版与自他上次检查以来的前一个。可能我理解错了。【参考方案26】:

更新:Subversion 1.9 将支持仅输出最新修订号的新命令“svn youngest”。与“svnlook youngest”的区别在于“svn youngest”也可以远程工作。

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

【讨论】:

以上是关于获取 SVN 中的最新修订号?的主要内容,如果未能解决你的问题,请参考以下文章

SVN 分支比较

svn 命令

人为增加SVN(FSFS)存储库中的修订号

自动将 SVN 修订号导入程序

以编程方式更新具有 SVN 修订号的 MFC 应用程序中的 FILEVERSION

如何在每次提交后自动保存 SVN 修订号?