bat脚本实现代码SVN的更新上传

1 篇文章 0 订阅

问题:前面写过一个脚本,实现了从git上下载最新代码,提交到svn服务器上。 《Windows下用bat实现git的Pull和Push及SVN的update和commit及自动配布处理》,但是使用过程中遇到一个问题,就是被已经被从文件系统上删除的文件,无法直接通过svn commit 实现提交。通过查看svn的文档,得知必须通过svn delete后再进行svn commit才能实现服务器上的文件删除。

思路:1,通过svn status找到被文件系统上删除的文件。

           2,然后通过svn delete 进行svn上的删除。

           3,然后再通过svn 进行 commit,实现svn服务器上的文件删除。

实现:

::参数校验
echo "api,web,batch,intf,"|findstr "%pj%,">nul
if %errorlevel% NEQ 0 (
echo "参数输入不正确,请输入正确的工程名:api/web/batch/intf/"
exit /B 1
)

::把SVN的代码取最新
cd %svn_path%
svn update --accept mf                                                            
cd %home%

::把SVN路径下的代码删掉,把最新代码拷贝到SVN的目录
del  /f /s /q %svn_path%\dist\*.*                                              
xcopy %git_path%\dist\*.* %svn_path%\dist /E/Y/D                              


cd %svn_path%
::把追加的代码追加到svn
svn add . --no-ignore --force                                                 
::把变更和追加的代码先提交到svn服务器上
svn commit -m "自动发布到%tar%环境,分支:%branch%" -q                            
if %errorlevel% NEQ 0 (                                                                  
echo 代码提交错误失败
goto er
)

::删除文件系统上删除的文件
call svn status > delete.log
for /f "eol=M tokens=1,2* delims= " %%i in (delete.log) do (
if "%%i"=="!" call svn delete %%j --force
)
svn status > delete.log
del delete.log
::把删除的文件提交到SVN服务器上
svn commit -m "自动发布到%tar%环境-删除文件"                                   
if %errorlevel% NEQ 0 (                                                                  
echo 代码提交错误失败
goto er
)
cd %home%

遇到的坑:

1,用if else判断的层数太多,最后利用bat中字符串的查找findstr 实现。

    findstr通常用于在文件中查找,这里通过管道实现,找到了errorlevel为0,找不到为1

    echo "api,web,batch,intf,framework,"|findstr "weba,">nul
    echo "%errorlevel%"

2,svn status查看文件状态,输出到文件, !开头行是文件系统上找不到的文件。

          svn status > delete.log
          M      wc/bar.c
          !        wc/qaz.c
                  >   local missing, incoming edit upon update
          D       wc/qax.c

3,解析生成的delete.log的时候,循环读文件的时候,bat的for循环中的变量值不能取到正确的值。

     解决方案:因为只需要取第一个字符是否为"!",然后取后面的文件名,所以直接用for循环中的取得值,

     不在for循环中进行变量的赋值。

call svn status > delete.log
for /f "eol=M tokens=1,2* delims= " %%i in (delete.log) do (
if "%%i"=="!" call svn delete %%j --force
)
:: eol=M M开头的行忽略掉
:: tokens1,2*  取第一个和第二个字符
:: delims=空格 按照空格来分割
:: %%i是显示声明的用空格分隔出第一个字符
:: %%j不用显示生命,是用空格分割出的第二个字符

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gavin__Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值