1

他の作業コピーがコミットされたときにライブ サーバー上の特定の作業コピーを更新する Subversion リポジトリのコミット後のフックに取り組んでいます。作業コピー全体で更新コマンドを実行すると機能しますが、変更された特定のファイルに対して実行したい場合は機能しません。Windows 2008 サーバーで VisualSVN サーバーを実行していますが、フックは .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>) 
)
4

1 に答える 1

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

これは、バッチ スクリプターが「キャリア」の初期に直面する最初の最も紛らわしい問題の 1 つです。詳細はこちら :-)

于 2013-10-21T18:23:30.127 に答える