如何在Subversion post-commit钩子中循环更改?

时间:2013-10-21 12:47:56

标签: svn batch-file cmd visualsvn-server post-commit-hook

我一直在为我的Subversion存储库创建一个post-commit钩子,它会在提交其他工作副本时更新我的​​实时服务器上的特定工作副本。当我在整个工作副本上运行update命令时,我有它工作,但是当我想对已经改变的特定文件执行它时。我在Windows 2008服务器上运行VisualSVN Server,并且钩子从.cmd文件运行。

非常感谢任何帮助。这是我正在使用的代码:

@ECHO OFF
svnlook dirs-changed %1 -r %2 | findstr /b /i "trunk"

IF %ERRORLEVEL% EQU 0 (
    pushd <path_to_working_copy>
    SET CHANGES=svnlook changed %1 -r %2
    FOR /F "tokens=2" %%a IN ('%CHANGES%') DO (svn update %%a --username <username> --password <password>)
)

我认为FOR循环存在问题,但我不知道它是什么。这是用于更新整个工作副本的代码。但是,这个解决方案实际上并不可行,因为每次提交都需要很长时间才能运行更新:

@ECHO OFF
svnlook dirs-changed %1 -r %2 | findstr /b /i "trunk"

IF %ERRORLEVEL% EQU 0 (
    pushd <path_to_working_copy>
    svn update --username <username> --password <password>
)
编辑:基于我在CMD中读到的关于FOR循环的内容,我已经对上面的代码做了一些小的修改,但它仍然无效。我没有收到任何错误,但更新没有执行。

编辑:我找到了一个问题的解决方案,该问题作为.bat文件或CMD文件运行得非常好,但它仍然不会从post-commit.cmd更新。它不会返回任何错误,它只是不运行更新:

@ECHO OFF
svnlook dirs-changed %1 -r %2 | findstr /b /i "trunk"

IF %ERRORLEVEL% EQU 0 (
    FOR /F "tokens=2" %%a IN ('svnlook changed %1 -r %2') DO (SET NEWA=%%a & SET NEWB=%NEWA:trunk/=% & svn update <path_to_working_copy>\%NEWB% --username <username>--password <password>) 
)

1 个答案:

答案 0 :(得分:3)

试试这个:

@ECHO OFF

setlocal enableDelayedExpansion
svnlook dirs-changed %1 -r %2 | findstr /b /i "trunk"    
IF ERRORLEVEL 1 (
    FOR /F "tokens=2" %%a IN ('svnlook changed %1 -r %2') DO (
    SET NEWA=%%a 
    SET "NEWB=!NEWA:trunk/=!"
    svn update <path_to_working_copy>\!NEWB! --username <username>--password <password>) 
)
endlocal

这是批处理脚本编写者在“职业生涯”开始时面临的第一个也是最令人困惑的问题之一。 Here's more info: - )