获取 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>&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 $url
或svn 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 <REPOSITORY-NAME>
$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 info
或 svnversion
不会考虑子目录,要找到实时代码库的最新“修订版”,下面的黑客方式对我有用 - 可能需要一段时间才能运行:
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 中的最新修订号?的主要内容,如果未能解决你的问题,请参考以下文章