Subversion 特定のファイル、ディレクトリを除外してチェックアウトする方法

更新日:

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ディレクトリを"再帰的"に更新する

他にもfilesimmediatesオプションがありますが割愛します。

チェックアウトしたものの、自身の作業に不要な物がある場合などは
excludeemptyを指定し更新すれば、ローカルから消えます。

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

-開発
-, ,

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