Subversion, Git ディレクトリをミラーリング、同期しコミットする方法

投稿日:

CI環境でビルドを行っていると、バイナリファイル、exe、dll等 成果物 を配布用のディレクトリに同期させてコミットしたい事がよくあります。

今回はWindows環境における Subversion、Gitでのサンプルを書いてみます。

手順

同期したいディレクトリにミラーリング処理を実行する

Windowsでミラーリングを行うには、robocopyコマンドがあります。
オプションで、ミラーリングだけでなくリトライ回数を指定したり、除外ディレクトリ指定等が出来ます。

robocopy %SRC_PATH% %DEST_PATH% /MIR /XD .git /NP R:1

コマンドの説明は割愛します。

ステータスを確認し、追加削除処理を行う

Subversion、Gitどちらもstatusオプションが存在します。
svn status
?     unmanaged.txt
!     lost.txt
A       add-file.txt
git status -s
A  add-file.txt
 D deleted.txt
?? unmanaged.txt

これらの情報を用いて、追加、削除処理を行います。

bat処理で一行ずつ処理する

batのfor文では、/fと合わせてusebackqを指定することで、コマンドの出力結果を使用し1行ずつ処理する事が可能です。

さらにtokensを指定することで、スペースで分割し、状態とパスを取得する事ができます。

for /F "usebackq tokens=1,2" %%i IN (`svn status`) do (
    echo %%i
    echo %%j
    echo.
)
?
unmanaged.txt

!
lost.txt

A
add-file.txt

コミット(プッシュ)を行う

ここは適宜処理します。割愛します。

サンプル

Subversion - bat

@echo off
rem .svn ディレクトリを除外しなければいけない事に注意
robocopy %SRC_PATH% %DEST_PATH% /MIR /XD .svn /NP R:3
if errorlevel 8 goto error

pushd %DEST_PATH%
for /F "usebackq tokens=1,2" %%i IN (`svn status`) do (
    if %%i==? (
        rem 管理外ファイルという事は追加されたファイル
        svn add %%j
    ) else if %%i==! (
        rem 紛失しているという事は削除されたファイル
        svn delete %%j
    )
)

svn commit -m "ミラーリング"
popd
exit /b 0

:error
echo error robocopyに失敗
exit /b 1

Git - bat

@echo off
rem .git ディレクトリを除外しなければいけない事に注意
robocopy %SRC_PATH% %DEST% /MIR /XD .git /NP R:3
if errorlevel 8 goto error

pushd %DEST_PATH%
for /F "usebackq tokens=1,2" %%i IN (`git status -s`) do (
    if %%i==?? (
        rem 管理外ファイルという事は追加されたファイルの可能性
        git add  %%j
    ) else if %%i==D (
        rem 削除状態をステージングへ
        git add  %%j
    )
)

git commit -m "ミラーリング"
git push origin master
popd
exit /b 0

:error
echo error robocopyに失敗
exit /b 1

参考リンク

svn status
  http://www.thekyo.jp/manual/subversion/svn.ref.svn.c.status.html

git status Short Format
  https://git-scm.com/docs/git-status#_short_format

.bat(バッチファイル)のforコマンド解説。
  https://qiita.com/plcherrim/items/67be34bab1fdf3fb87f9

-開発
-, , ,

Copyright© 打ち聞かせ , 2020 All Rights Reserved Powered by STINGER.