Jenkins等のCI環境では、ルートパスから全てチェックアウトすると
無駄な物まで落ちてきてしまって困る事が多々...
特定のファイルやディレクトリをチェックアウトしないようにしたい事があります。
今回は、batファイルを例に説明します。
サンプルで使用するリポジトリ
今回の記事では以下のリポジトリで説明します。
このうち、Sourceディレクトリだけ除外したい!という事にします。
ディレクトリを指定して個別に取得する
trunkを空の状態でチェックアウトし、必要な物のみupdateを行います。
@echo off
set URL=file:///D:/project/svn/repository/trunk
set WORKSPACE=.\test
rem 空の状態でチェックアウト
svn checkout --depth empty %URL% %WORKSPACE%
rem 必要なディレクトリ、ファイルを個別で更新する
pushd %WORKSPACE%
svn update --set-depth infinity ABC
svn update --set-depth infinity Test
svn update hoge.txt
popd
checkout
の--depth
オプションと、update
の--set-depth
オプションがポイント。
ディレクトリに対して深度を指定して更新する事が可能です。
パラメータの一部を紹介します。
exclude | ディレクトリを更新しない |
empty | ディレクトリの"中身"を更新しない |
infinity | ディレクトリを"再帰的"に更新する |
他にもfiles
とimmediates
オプションがありますが割愛します。
チェックアウトしたものの、自身の作業に不要な物がある場合などは
exclude
やempty
を指定し更新すれば、ローカルから消えます。
svn update --set-depth empty ABC
再度取得したい場合は、infinity
を指定して更新すればOKです。
svn update --set-depth infinity ABC
チェックアウトするディレクトリやファイルが決まっており、
数も少なければこれで十分かと思います。
指定ディレクトリ以外を取得する
どんなディレクトリが登録されているか知らないが、
「○○○」ディレクトリのみ取得したくない!そんな事ってありますよね。
そんなときは、svn list
コマンドを使用します。
svn list
svn list
ABC/
Source/
Test/
hoge.txt
URLを指定して直接する場合
svn list file:///D:/project/svn/repository/trunk
ABC/
Source/
Test/
hoge.txt
ファイルであれば名前 のみですが、ディレクトリであれば終端に「/」が付加されます。
後は、この出力結果を使って更新処理を呼び出すだけです。
サンプルコード bat
@echo off
setlocal enabledelayedexpansion
set URL=file:///D:/project/svn/repository/trunk
set WORKSPACE=.\test2
svn checkout --depth empty %URL% %WORKSPACE%
pushd %WORKSPACE%
for /F "usebackq" %%i IN (`svn list .`) do (
set NAME=%%i
rem ディレクトリかファイル名か判断
if !NAME:~-1!==/ (
if %%i==Source/ (
echo Sorceディレクトリは除外します
) else (
svn update --set-depth infinity %%i
)
) else (
svn update %%i
)
echo.
)
popd
trunkを空っぽでチェックアウトする
set URL=file:///D:/project/svn/repository/trunk
set WORKSPACE=.\test2
svn checkout --depth empty %URL% %WORKSPACE%
svn list コマンドの出力結果を一行ずつ処理する
for /F "usebackq" %%i IN (`svn list .`) do (
set NAME=%%i
for文では、/f
と合わせてusebackq
を指定することで、コマンドの出力結果を使用し1行ずつ処理する事が可能です。
ディレクトリかファイルか分岐する
rem ディレクトリかファイル名か判断
if !NAME:~-1!==/ (
if %%i==Source/ (
echo Sorceディレクトリは除外します
) else (
svn update --set-depth infinity %%i
)
) else (
svn update %%i
)
文字列の判定を行うため%%i
を別の変数にセットするので、サンプルコード2行目でsetlocal enabledelayedexpansion
を指定し、遅延環境変数を使用できるようにしています。
遅延環境変数についてはここでは説明しません。
rem ディレクトリかファイル名か判断
if !NAME:~-1!==/ (
%NAME%
にフォルダ名かディレクトリ名が入っているため、
最後の1文字が「/」かどうかで判定します。
No | 書式 | 変化 |
1 | %A% | そのまま。全て。 |
2 | %A:~m% | 先頭 m 文字目から最後 |
3 | %A:~m,n% | 先頭 m 文字目から n 文字 |
4 | %A:~m,-n% | 先頭 m 文字目から 末尾から n -1文字目まで |
5 | %A:~-m% | 末尾 m 文字目から最後 |
6 | %A:~-m,n% | 末尾 m 文字目から n 文字 |
7 | %A:~-m,-n% | 末尾 m 文字目から 末尾から n -1 文字目まで |
8 | %A:a=b% | 文字列 a を文字列 b に変更 (文字列置換) |
この「5」番ですね。「~-1」を指定すれば、最後の文字が取得できます。
その文字が、「/」かどうかif文で判定しているだけですね。
後の処理は特に説明は不要かと思います。
ディレクトリかファイルか判断出来たので、除外するも更新するも良しです。
参考リンク
.bat(バッチファイル)のforコマンド解説。
https://qiita.com/plcherrim/items/67be34bab1fdf3fb87f9
Windows - バッチ - 部分文字列の取得
https://freebsd.sing.ne.jp/windows/03/06.html