svn:externals
症状
svn(cli)の propset ではリポジトリに直接外部依存が設定できません*1。素直に考えた propset による方法は、次のようになりそうですが、エラーになります*2。
svn propset svn:externals '^/../Lib/trunk lib' file:///F:/SVN/App/trunk
対策
「propedit -editor-cmd」を使うとできるようです。
external="Lib" working="lib" target="App" tmppath=$(cygpath -u `mktemp`) echo "\"^/../$external/trunk\" \"$working\"" >"$tmppath" ${svn} propedit svn:externals \ --editor-cmd "cp $tmppath" "file:///F:/SVN/$target/trunk"
次のようなリポジトリを構成しているものとします。
F:/SVN ├ Lib/ │├ branches/ │├ tags/ │└ trunk/ │ └ src/ └ App/ ├ branches/ ├ tags/ └ trunk/ ├ resources/ └ src/
App/trunkをC:/projectsにチェックアウトすると次のようなワーキングコピーになります*4。
C:/projects/App/ ├ lib/ ← file:///f:/SVN/Lib/trunk の external │ └ src/ ├ resources/ └ src/
補足
「--editor-cmd」には通常は、エディタの名前を与えます。すると内部で、「svn-prop.tmp」というファイルを引数にして、エディタを起動します。例えば、つぎのようになります。
system( 'vi svn-prop.tmp' )
「cp ファイル名」を与えることで、「svn-prop.tmp」が付加されて、次のようなコマンドとして実行されます。
system( 'cp /tmp/tmp.UbVGynKYEb svn-prop.tmp' )
めでたし、めでたし。
*1:ワーキングコピーならば、外部依存の設定はできます
*2:「... needs a base revision」というエラー
*3:とはいえ、SVNのドキュメントにはpropedit推奨、つまり、どうせ複数行の設定が主流でしょ?とあるので、実用上はpropsetによるexternals構成はマイナーな方法なのだろうと思います
*4:こういうテスト的・擬似的な構成だとpropsetで1行で書きたくなりますが、実際にはより複雑な外部依存を書く必要があるので、必然的にpropeditを使うことになります・・・ということは、また無駄なことを書いてしまったという・・・でも、練習ではやるよねぇこういうの、そこで動かないとつまずくよねぇ・・・おいらはつまずいた。思い切りつまずいた