我一直在为我的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>)
)
答案 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: - )