svn:externals

症状

svn(cli)の propset ではリポジトリに直接外部依存が設定できません*1。素直に考えた propset による方法は、次のようになりそうですが、エラーになります*2

 svn propset svn:externals '^/../Lib/trunk lib' file:///F:/SVN/App/trunk

SVNのフォーラムを漁ると、「バグ」とか「未サポート」などの言葉が散見されます*3

対策

「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を使うことになります・・・ということは、また無駄なことを書いてしまったという・・・でも、練習ではやるよねぇこういうの、そこで動かないとつまずくよねぇ・・・おいらはつまずいた。思い切りつまずいた