Windows环境下如何检测特定SVN修订版本是否存在于主干
我之前在Windows环境下处理过类似的Subversion版本检测需求,给你分享几个实用的方案,既能满足你的需求,还能优化构建效率:
你的svn info思路完全可行,还能优化细节
你通过svn info加%ERRORLEVEL%判断修订号是否存在的方法是对的:
- 当修订号存在时,命令正常执行,
%ERRORLEVEL%返回0 - 要是修订号不存在(比如你例子里的11456),命令会报错,
%ERRORLEVEL%会返回非0值(一般是1)
可以给命令加个--quiet参数,关掉冗余输出,让脚本更简洁:
svn info svn://oursvnserver/ourproject/trunk -r 11456 --quiet if %ERRORLEVEL% EQU 0 ( echo 修订号11456存在,可以开始构建 ) else ( echo 修订号11456不存在,直接跳过 )
大范围遍历?试试批量获取修订号的高效方案
如果你的遍历范围很大,逐个跑svn info会频繁请求服务器,速度拖慢不少。不如先一次性把主干上所有存在的修订号拉到本地,之后直接在本地判断,省掉多次服务器请求:
- 先导出主干的所有修订号到本地文件:
svn log svn://oursvnserver/ourproject/trunk --quiet --xml | findstr /r "<revision>[0-9]*</revision>" > revisions.txt
这个命令用XML格式输出日志,再用findstr提取出所有带修订号的行,存到revisions.txt里。
- 用PowerShell或者批处理本地检测目标修订号,这里推荐PowerShell,写法更简洁:
$targetRev = 11456 # 提取出纯数字的修订号列表 $revisions = Get-Content revisions.txt | ForEach-Object { [int]($_ -replace "<revision>|</revision>", "") } if ($revisions -contains $targetRev) { Write-Host "修订号$targetRev存在,执行构建流程" } else { Write-Host "修订号$targetRev不存在,跳过本次构建" }
这样只需要一次服务器请求,后续所有检测都在本地完成,大范围遍历的时候效率提升特别明显,刚好匹配你要避免重复构建的需求。
额外小提示
- 如果你的主干有分支合并过来的修订号,
svn log默认会显示所有影响主干的修订号(包括合并的)。要是你只需要主干上直接提交的修订号,可以加个--stop-on-copy参数,这样只会显示从主干创建以来的直接提交记录。 - 新版本SVN也支持用
svn ls结合-r参数判断,但svn info的兼容性更好,在各个版本的SVN里都能稳定工作。
内容的提问来源于stack exchange,提问作者edt11x
相关产品推荐
相关产品推荐

