通过TortoiseSVN在命令行上获取当前修订版本号

14

我正在尝试编写一个批处理文件,其中需要获取我正在使用的项目的 HEAD 版本。

是否有命令可以从命令行中获取它?

我在 Windows XP 计算机上。

编辑 最终我采用了 Shambulator、mizipzor 和 Stefan 的答案的混合。我最终得到了这个:

for /f "tokens=5" %%i in ('SubWCRev WorkingCopyPath^|find "Last committed at revision"') do set version=%%i 
echo %version%

感谢大家的帮助。

我也将此答案添加到下面的列表中。


3
你尝试过使用“svnversion ./”吗?这是在命令行中,你会得到你所检出的当前版本号。 - jmdiego
11个回答

28

虽然没有*nix的文本处理功能有些尴尬,但是这个批处理文件可以实现:

@echo off
for /f "tokens=2" %%i in ('svn info -rHEAD svn://localhost^|find "Revision"') do @echo %%i

用你的svn仓库替换我的svn://localhost

svn info获取仓库信息,然后将其导入到find中,该命令会过滤掉除包含版本号的行之外的所有内容。使用for命令获取该行上第二个“token”(第一个是Revision:)。

编辑: 正如其他人已经提到的,您需要安装Subversion的命令行版本,并且在PATH中有svn.exe


1
我看到的第一个不需要*nix工具的真正解决方案。 - Mizipzor
1
@Nedloh:我认为在TortoiseSVN安装文件夹中应该有一个svn.exe文件(检查是否有bin文件夹或类似的文件夹)。不幸的是,我现在无法安装它,也找不到一个平面安装的zip存档文件在下载页面上,所以我不能自己查看。 - Mizipzor
1
将此解决方案与Stefan提出的实用程序结合使用。现在在问题以及答案中都提供了解决方案。 - Nedloh
1
你可能想使用 findstr /bRevision 字符串锚定到行的开头。此外,我可能会使用冒号作为分隔符 - 谁知道哪种语言将“Revision”拆分成两个单词... - Joey
@Nedloh 默认情况下,TortoiseSVN不会安装命令行工具。因此,每次安装时我都会手动启用该功能,因为它们非常有用(而且TortoiseSVN通常比Apache或Collabnet的官方Windows版本更早发布这些工具)。 - Jeroen Wiert Pluimers
显示剩余7条评论

4
如果您需要在文件中进行修订,请使用TortoiseSVN中安装的SubWCRev(或单独提供的)。您可以通过以下链接下载:SubWCRev独立版本

我确实需要它在一个文件中,但我需要它在运行的脚本中,所以那样不太可行。然而,我认为如果我可以使用SubWCRev并从输出中提取修订号,那么我就可以实现我的目标,而无需安装另一个支持命令行功能的svn客户端。 - Nedloh

3

最终,我采用了Shambulator、mizipzor和Stefan的答案的混合。最终结果如下:

for /f "tokens=5" %%i in ('SubWCRev WorkingCopyPath^|find "Last committed at revision"') do set version=%%i  
echo %version% 

感谢大家给予的所有帮助。

1

TortoiseSVN不提供任何命令行界面,因为它只是一个Shell扩展程序。

然而,如果您安装svn命令行工具,则可以使用以下命令获取SVN URL的详细信息:

svn info [SVN-URL]

要提取修订版本号,可以使用以下命令:

svn info [SVN-URL] | grep Revision | awk '{print $2}'

(假设您已经安装了一些Unix工具,例如cygwin)


啊,好的,我一直在查看乌龟命令行文档,希望我只是漏掉了什么。试图编写一个批处理文件,以便从源文件到构建和编译安装程序“自动化”并不容易。 - Nedloh

1

目前的回答列表告诉您如何在中央svn存储库上打印当前修订版本。如果您对 当前本地检出版本 感兴趣,我发现 这篇博客文章 做了类似于 Shambulator的回答 的事情:

@echo off
FOR /F "tokens=2 skip=4" %%G IN ('svn info --revision HEAD') DO ^
IF NOT DEFINED REVISION SET REVISION=%%G
echo %REVISION%

在这个批处理文件的过程中,用户必须更新到最新版本(在批处理文件中强制执行),因此任何一种方式都应该可以。 - Nedloh
@Nedloh:很高兴听到这个消息。但是我会敦促你,正如Shambulator所指出的那样,如果你正在设置基础设施,那么请阅读有关MSBuild的资料。 - Mizipzor

1

我知道这个问题很旧,但正是我在寻找的,唯一的问题是我无法让答案起作用。以下是我最终使用的批处理脚本:

set SubWCRev=C:\Program Files\TortoiseSVN\bin\SubWCRev.exe
set WorkingCopyPath=%~dp0
for /f "tokens=5" %%i in ('""%SubWCRev%" "%WorkingCopyPath%.""') do set version=%%i
@echo Version=%version%

我使用批处理文件所在的目录作为SVN仓库文件夹,如果您想将目录作为参数传递,请使用%~dp1。

这将在修订号后添加一个尾随空格。 - daniol

0

这似乎比之前的所有答案都更容易:

svnlook youngest <repo-path>

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


0

我认为没有办法直接使用tortoisesvn从命令行完成这个任务。您可以从Collabnet安装命令行版本,然后使用以下命令:

c:\>svn ls -v svn://server/Source
67336 user1                Jul 05 13:00 ./
67336 user1                Jul 05 13:00 Source/

这是67336修订号吗?我需要一些能够轻松提取的东西,因为我将通过批处理文件使用它。如果它是提供的第一项,这可能会证明有用。 - Nedloh
是的,这是存储库中最新修订版本(即头部)的修订版本。如果您正在使用多个分支,则应相应地将其替换为 svn://.../Source/trunk.../Source/branches/mybranch - the_mandrill

0

另一种可能的方法。 如果您已经检出了存储库,那么 .svn\entries 文件的第四行中有修订号。 例如:

head -4 entries | tail -1

将给您提供修订号。

使用此方法可能不是很明智,因为文件的格式可能会更改 - 这实际上取决于脚本是否仅供个人使用。


0
svn info -rHEAD %cd%|find "Revision:"> %temp%\__svnrev.tmp
set /p revision=< %temp%\__svnrev.tmp
del %temp%\__svnrev.tmp
set revision=%revision:~10%
echo %revision%

将第一行中的%cd%更改为您想要的路径


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