当前Subversion修订版命令


75

是否有Subversion命令显示当前修订号?

之后,svn checkout我想启动一个脚本并需要一个变量中的修订号。如果有这样的命令,那就太好了svn info get_revision_number

Answers:


118

较新版本的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只告诉您退出代码,它没有提供获取输出的方法。相反,比起尝试在Python中编写bash命令,执行svn info(例如使用subprocess模块​​),直接在Python(if "Revision" in line: return line.split()[1])中读取输出并执行grep / awk步骤通常更容易。

4
摆脱grepsvn info | awk '/Revision/ { print $2; }'
只是有人

4
如果您仍然要调用awk,则可以跳过grep部分:svn info | awk '/^Revision:/ {print $2;}'
ndim 2010年

1
如果您的系统使用的是语言环境,则应在前面添加“ LANG = C”,如下所示:LANG=C svn info | grep "Revision" | awk '{print $2}'
Florent 2013年

24

还有一个更方便的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文件中,第四行

现在,每次签出该文件时,它本身都会具有修订版本。


对于第3项,期望修订版本号始终位于第4行是否合理?如果这是合理的期望,那么这似乎是在几乎所有环境中执行此操作的最简单方法。
grimus 2010年

是的,至少在合理的Subversion版本范围内。如果他们在将来的某个版本中更改了格式(可能,但不太可能很快更改),则您必须进行调整。
Kornel Kisielewicz

我仔细研究了一下,发现了这一点:svnbook.red-bean.com/en/1.4/svn.developer.insidewc.html 听起来格式有时可能会发生变化。我敢肯定,在大多数情况下,读取条目文件都可以,但是如果条目文件发生更改,则必须确保维护代码。
grimus 2010年

糟糕,我在发布之前没有看到您的评论,但是我仍然同意。
grimus 2010年

尝试svn, version 1.11.0 (r1845130) compiled Oct 31 2018, 12:40:42 on x86_64-unknown-cygwin::.svn/entries仅包含一个整数。
巴达姆斯


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=...>输入的内容可能会更多。这样就产生了“ Last Changed Rev”,直到当前树中的代码实际发生更改时才更改,而“ Revision”(以上给出的)则会在存储库中的任何内容发生更改(甚至分支)时更改。并且您进行了“ svn up”,这不是同一回事,也常常没有用。


要求svn输出XML,然后解析它?这是在开玩笑吗?
Julien Guertault 2014年

1
@JulienGuertault,不,XML输出意味着对程序同时使用非XML是没有的。解析人工输出会冒着将来更改格式和破坏代码的风险,并且根据上下文,每次您需要执行类似操作时,都可能需要自定义工作。如果使用XML方法,随着时间的流逝,可能会节省基础结构方面的工作。别开玩笑了,但是我也不会说这样做反而是错了。只是个人喜好。我已经用不同的内容完成了这两项工作。
彼得·汉森

机器与人工输出解析是一个有效的观点(值得在您的答案中强调)。但是为什么不简单地使用svnversion呢?它具有记录的紧凑输出,不需要复杂的东西来解析它。
Julien Guertault 2014年

@frgtn在上面给出了svnversion的答案,但是,正如我提到的,在各种svn子命令上使用--xml输出选项可以为您提供统一的方式来处理各种需求。使用svnversion,您可能需要另一个自定义解析器,例如,如果不想的话,可以处理附加的“ M”。请考虑一下我的答案,这是OP不能接受的许多可能替代方法之一,但对于从搜索中到达此处的后来者可能有用。
彼得·汉森

感谢您的额外说明。
Julien Guertault 2014年

2

刚在修改版本中使用@badcat的答案,使用subprocess.check_output()

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

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


1

没有人提及Windows世界SubWCRev,如果脚本以以下形式调用SubWCRev,那么正确使用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$

结果,我每次都有带有可变部分的bat文件-dir的名称-对应于工作副本的元数据


0

我想我必须做svn信息,然后使用来自“修订版:xxxxxx”的字符串操作来检索数字,如果有一条仅返回数字的命令,那将是很好的:)


0

否则,对于旧版本,如果无法识别'--show-item',则可以使用以下命令:

svn log -r HEAD | grep -o -E "^r[0-9]{1,}" | sed 's/r//g'

希望能帮助到你。

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.