svn:ignore

症状

svnでignoreを設定したいのです。

working-copy        repository
TestApp/            root/
 ├ dist/            ├ branches/
 ├ obj/             ├ tags/
 ├ include/         └ trunk/
 ├ resources/           ├ resources/
 └ src/                 └ src/


左側がワーキングコピーのフォルダ構成で、obj/ はコンパイルの中間ファイル、dist/ は実行形式のフォルダなのですが、リポジトリには格納する必要がないので、ignoreを設定したいのです。

対策

次のスクリプト(の断片)で、リポジトリの親フォルダ(trunk)にプロパティを設定します。「ignore」なので、リポジトリには存在しないのは当たり前ですが、存在しないフォルダ名やファイル名を設定できます*1。(add_exit_item 関数はスクリプト終了時(trap EXIT)処理です(4/19))

# ignore
#
# $1 ... folder name
# $2 ... repository url
#
function svn_ignore {
    local folder_name="$1"
    local repository_url="$2"

    # properties text
    local tmp_prop=$(cygpath -u `mktemp`)
    add_exit_item rm -f "\"$tmp_prop\""
    
    ${svn} propget svn:ignore "$repository_url" > "$tmp_prop"
    echo "$folder_name" >> "$tmp_prop"
    
    ${svn} propedit svn:ignore --editor-cmd "cp $tmp_prop" "$repository_url"
}

svn_ignore "dist" "file:///f:/SVN/TestApp/trunk"
svn_ignore "obj" "file:///f:/SVN/TestApp/trunk"
svn_ignore "include" "file:///f:/SVN/TestApp/trunk"


propeditに関しては、5/10svn:externals を参照してください。

TortoiseSVNで、trunkのプロパティを確認すると、次のように「dist obj include」が設定されています。

スクリプトでは、フォルダ毎ignoreしてますが、ファイルでもファイルパタンでもいけるはずです(試してないけど)。

*1:この文章に隠された意味は・・・「ignoreをsvnで設定する・・・リポジトリに無いファイル(フォルダ)をsvn-リポジトリの操作コマンド-でどうやって設定するんだ」というアホなことを思ってしまったからです。おいらの頭の鈍さは屈辱的でさえある