svnant で作成・更新・削除したファイルを同期

Subversionは素のまま使うことは少なくだいたい TortoiseSVNeclipse 上から使うので普段は困らないのだが、いざバッチ処理的に使いたいと思った場合に困ったことになる。なぜなら svn コマンドは更新したファイルだけは commit で更新されるが、新規と削除はそれぞれ別コマンドで実行しなければならないからだ。Subversionの 各コマンドを Ant から実行できる svnant というライブラリがあるのだが、これも基本的に svn に準じた作りになっている。

TortooiseSVN のように作成したファイルは自動的に add してほしいし、削除したファイルは delete してほしい。ようするにローカルのファイルとサーバのファイルを同期したい場合はどうすればいいのだろうか。

実は前述のサイトから直接飛べるドキュメント以外に svnant には、selecterとconditionのドキュメントがありそちらに書いてある。これらはダウンロードしたファイル中にある(これに気づくのにずいぶんかかってしまった)。その方法を使うと下記のように書ける。

<svn username="foo" password="bar">
    <add>
       <fileset dir=".">
           <svnUnversioned />
       </fileset>
    </add>
    <delete force="true">
       <svnFileSet dir=".">
           <svnMissing />
       </svnFileSet>
    </delete>
    <commit dir="." message="auto deploy" />
</svn>

filesetはローカルファイルを基準に、svnFileSetはリモートファイルを基準にして対象を決める点がみそ。これでローカルファイルとリモートファイルの同期が取れる(ただし、コンフリクトは防止できないので、ロックをするなどその点の注意は必要)。