当前的Subversion修订命令

87

有没有Subversion命令可以显示当前修订版本号?

svn checkout之后,我想启动一个脚本并需要将修订版本号存入一个变量中。如果有类似 svn info get_revision_number 的命令将非常方便。

10个回答

136

svn的新版支持--show-item参数:

svn info --show-item revision

要获取本地工作副本的版本号,请使用:

svn info --show-item last-changed-revision

您可以使用 os.system() 来执行类似于以下命令行的操作:

svn info | grep "Revision" | awk '{print $2}'

我在夜间编译脚本中执行此操作。

此外,在一些平台上,存在一个名为svnversion的命令,但我认为我有不使用它的原因。啊,对了。使用svnversion无法从远程存储库获取版本号以将其与本地存储库进行比较。


4
请注意,原始问题中有一个 cmd.exe 标签,这意味着 OP 在 Windows 系统中,无法使用 grepawk - iamamac
1
os.system只告诉您退出代码,它没有提供获取输出的方法。相反,执行svn info(例如使用subprocess模块),读取输出并直接在Python中执行grep/awk步骤(if“Revision”in line:return line.split()[1])通常比尝试在Python中编写bash命令更简单和容易。 - Roger Pate
4
去除 grepsvn info | awk '/Revision/ { print $2; }'(注:该命令用于从 SVN 仓库获取版本号,将其修改为不需要使用 grep 命令的形式。)去除 grep:通过使用 awk 命令,匹配包含 "Revision" 的行,并打印第二个字段。命令如下:svn info | awk '/Revision/ {print $2}' - just somebody
4
如果您已经使用awk,可以跳过grep部分:svn info | awk '/^Revision:/ {print $2;}' - ndim
1
如果您的系统正在使用本地化设置,您应该在前面添加“LANG=C”,例如:LANG=C svn info | grep "Revision" | awk '{print $2}' - Florent
显示剩余3条评论

26

还有一个更为方便(对某些人而言)的svnversion命令。

输出可能是一个单独的修订版本号,或者像这样(来自 -h):

  4123:4168     mixed revision working copy
  4168M         modified working copy
  4123S         switched working copy
  4123:4168MS   mixed revision, modified, switched working copy

我使用以下 Python 代码片段来提取修订信息:

import re
import subprocess

p = subprocess.Popen(["svnversion"], stdout = subprocess.PIPE, 
    stderr = subprocess.PIPE)
p.wait()
m = re.match(r'(|\d+M?S?):?(\d+)(M?)S?', p.stdout.read())
rev = int(m.group(2))
if m.group(3) == 'M':
    rev += 1

5
  1. 首先,svn状态包含修订版本号,您可以从中读取。

  2. 此外,您在SVN中存储的每个文件都可以在自身中存储修订版本号--将$Rev$关键字添加到您的文件中,并运行propset:svn propset svn:keywords "Revision" file

  3. 最后,修订版本号还在.svn/entries文件的第四行中。

现在,每次您检出该文件,它都会在自身中具有修订版本。


对于第三项,期望修订号总是在第四行上,这是否合理?如果这是合理的期望,那么这似乎是跨越几乎任何环境执行操作的最简单方法。 - grimus
是的,至少在一个合理的Subversion版本范围内。如果他们在未来某个版本中更改了格式(可能但不太可能很快),那么您将不得不进行适应。 - Kornel Kisielewicz
我稍微研究了一下,找到了这个链接: http://svnbook.red-bean.com/en/1.4/svn.developer.insidewc.html 看起来格式可能会不时地发生变化。我相信对于大多数情况,读取entries文件都能正常工作,但如果entries文件发生变化,你就必须确保维护好你的代码。 - grimus
抱歉,在我发布之前我没有看到你的评论,但我认为我们还是意见一致的。 - grimus
尝试在 svn, version 1.11.0 (r1845130) compiled Oct 31 2018, 12:40:42 on x86_64-unknown-cygwin 上运行:.svn/entries 只包含一个整数。 - badams

4

REV=svn info svn://svn.code.sf.net/p/retroshare/code/trunk | grep 'Revision:' | cut -d\ -f2

可以翻译为:

版本号=svn info svn://svn.code.sf.net/p/retroshare/code/trunk | grep '版本:' | cut -d\ -f2


请注意,RetroShare可能存在一些安全问题。http://specialmeaning.blogspot.com/2016/09/retroshare-scandal-of-free-communication.html - Sergei Krivonos

3

有关Windows世界的SubWCRev很少被提及。如果正确使用,可以在脚本以SubWCRev WC_PATH TPL-FILE READY-FILE的形式调用时自动将所需数据替换到所需位置。

这是我提交后钩子的示例(部分内容)

SubWCRev.exe CustomLocations Builder.tpl  z:\Builder.bat
...
call z:\Builder.bat

我的 Builder.tpl 位于哪里

svn.exe export trunk z:\trunk$WCDATE=%Y%m%d$-r$WCREV$

因此,我每次都有一个批处理文件,其中包含变量部分-目录名称-与Working Copy的元数据相对应。

2
我相信你需要的是svn info命令。如果你只需要版本号,也许可以尝试以下命令:
svn info | grep "Revision:"

2

使用类似以下的方式,利用subversion的XML输出:

# parse rev from popen "svn info --xml"
dom = xml.dom.minidom.parse(os.popen('svn info --xml'))
entry = dom.getElementsByTagName('entry')[0]
revision = entry.getAttribute('revision')

请注意,根据您需要的功能,<commit revision=...> 条目可能更符合您的需求。它提供了“最后更改版本”,该版本仅在当前代码树中的代码实际更改时才会更改,而不是“版本”(上面给出的内容),后者将在任何时候更改存储库中的任何内容(甚至是分支),当您执行“svn up”时,这并非相同的事情,也不经常有用。

让svn输出XML然后解析它?这是开玩笑吗? - Julien Guertault
1
@JulienGuertault,不,XML 输出是 专门 用于编程使用,而非 XML 的输出则不是。解析人类输出存在风险,因为格式可能会在将来发生变化并破坏您的代码,并且根据上下文,每次需要执行类似操作时可能需要进行自定义工作。如果您使用 XML 方法,随着时间的推移,可以节省基础设施方面的努力。不开玩笑,但我也不会说以任何方式都使用另一种方法是 错误 的。这只是个人喜好。我已经在不同的情况下做过两种方法。 - Peter Hansen
机器与人类输出解析是一个有效的观点(值得在你的答案中强调)。但为什么不直接使用svnversion呢?它具有文档化的紧凑输出,不需要这么复杂的解析。 - Julien Guertault
@frgtn在上面的回答中提供了svnversion,但正如我所提到的,使用各种svn子命令的--xml输出选项可以为处理各种要求提供统一的方式。对于svnversion,您可能需要另一个自定义解析器,例如处理附加的“M”(如果您不想要它)。请将我的答案视为许多可能的替代方案之一,虽然未被OP接受,但可能对从搜索中到达此处的后来者有用。 - Peter Hansen
感谢您的额外解释。 - Julien Guertault

2

我刚刚使用了@badcat的答案并进行了修改,使用了subprocess.check_output()

import subprocess
revision = subprocess.check_output("svn info | awk '/^Revision:/ {print $2}'", shell=True).strip()

如果您想使用Python与SVN进行交互,我相信您也可以安装并使用pysvn


0
否则,对于旧版本,如果无法识别“--show-item”,您可以使用以下命令:
svn log -r HEAD | grep -o -E "^r[0-9]{1,}" | sed 's/r//g'

希望它能帮到你。

0

我认为我需要执行svn info,然后通过字符串操作从"Revision: xxxxxx"中检索出编号。如果有一个返回只有数字的命令,那就太好了:)


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