Windows サーバーで VisualSVN サーバーを介して Subvbersion を実行しており、リポジトリをトランクと 3 つのブランチでセットアップしています。ブランチは、dev、test、prod です。コミットの実行後に作業コピーを更新するコミット後のフックを実行したいのですが、コミットが dev ブランチで行われた場合にのみ、その作業コピーを更新したいのです。
これは私が今持っているコードです...
@setlocal enableextensions enabledelayedexpansion
@echo off
SET str1=%1
IF NOT x%str1:dev=%==x%str1% (
pushd <path to working copy>
svn update --username <svn_username> --password <svn_password>
echo update complete
)
endlocal
条件を削除すると、すべてのコミットで更新が実行されるため、条件内のコードが機能することがわかります。また、条件付きを通常のバッチ ファイルとしてテストし、「branches/dev」や「branches/test」などの文字列を送信して、これらのテストで適切に動作しました。ただし、これをコミット後のフック スクリプトとして保存すると、コミットが dev ブランチにあるかどうかに関係なく、実行されません。
編集:この質問は既に回答されているというフィードバックに基づいて、他の質問で推奨されているアプローチを試しましたが、そのアプローチも機能していません。そこで提案されたコードの私のバージョンは次のとおりです。
REM The command checks whether the committed revision changes any data under '/dev'
"%VISUALSVN_SERVER%bin\svnlook.exe" dirs-changed %1 --revision %2 | findstr /b "[Dd]ev"
REM If 'findstr' returns error code 0, it means that the commit involves the '/dev' directory.
REM So if the the returned code is 0 the command runs external batch 'post-commit-actions.bat'
If %ERRORLEVEL% EQU 0 call %~dp0post-commit-actions.bat %*
これを機能させるために、svn update を実行するために post-commit-actions.bat という名前のフック ディレクトリにファイルを作成しました。ただし、これはコミット後の実行ではありません。関連する情報を省略している場合は、お知らせください。
編集:みんなの助けに感謝します。ここでの入力により、実用的なソリューションをまとめることができました。同様の問題に対する答えを探している人にとっては、次のように機能しました。
svnlook dirs-changed %1 -r %2 | findstr /b /i "branches/dev"
IF %ERRORLEVEL% EQU 0 (
pushd <path-to-working-copy>
svn update --username <repo-username> --password <repo-password>
)