svnでディレクトリのみを管理したかった

svnでディレクトリのみを管理したかった。

まずデフォルト(freebsdのdevel/subversionでインストールされるsvn)では、ディレクトリに対してaddすると以下すべてのファイルが一緒にaddされる。

%svn add sitemap
A sitemap
A (bin) sitemap/sitemap1.xml.gz
A sitemap/sitemap1.xml
A (bin) sitemap/sitemapindex.xml.gz
A sitemap/sitemapindex.xml
A sitemap/sitemap0.xml
A (bin) sitemap/sitemap2.xml.gz
A sitemap/sitemap2.xml
A (bin) sitemap/sitemap3.xml.gz
A sitemap/sitemap3.xml

でもこのディレクトリの中身が、結構変わるもので、あくまでディレクトリは入れ物っていうだけ、中身のファイルをバージョン管理かにおいてほしくなかった。

まずは今回の問題に先立って、対象となるディレクトリの中身全部を誤ってバージョン管理下に置いてしまったのでそれをもどす。
%svn revert sitemap
deleteがいいのかな、とかちょっと考えたけど、revertだとaddされる前に戻るらしい。revertはちょっと危険なコマンド。必ず引数がいるあたり。
とにかくrevertすればaddを取り消せる。add->commitしてたらdeleteするしかないと思うけど。

次にバージョン管理化から外す方法。
svnではディレクトリごと(ファイルごと?)にpropと呼ばれる、管理情報のフラグ(true or falseだけじゃなくてほかにもあるよ?)みたいなのを持てる。これを設定してやれば管理対象から外すことができる。

今回のケースだと、sitemapっていうディレクトリの中にあるファイルはすべて管理外にしていただきたい。ということで、sitemapがあるディレクトリ直下でpropsetコマンドにてignoreのフラグをつける。

%svn propset svn:ignore “*” ./sitemap
svn: warning: ‘sitemap’ is not under version control

怒られてしまった。
注意すべきは*をダブルクォートとかで囲むこと。これはsitemapっていうディレクトリに対して、svn:ignoreっていう属性を”*”に適応させたいです、っていうのを”svn”に伝えるため。クォートされてないとシェルが展開しようとして、内部的には
%svn propset svn:ignore hoge1.txt ./sitemap
%svn propset svn:ignore hoge2.txt ./sitemap
%svn propset svn:ignore hoge3.txt ./sitemap
%svn propset svn:ignore hoge4.txt ./sitemap

となってしまうためだ。

最後に怒られてしまった原因は、そのまま、バージョン管理下にない、ということ。
デフォルトでaddは以下のディレクトリもaddしてくれる。便利だなぁ、と思ってたけど初めて今回、ディレクトリのみをaddしたくなった。
%svn add –non-recursive sitemap
A sitemap
これでおk。
最後にコミットしておしまい。

コメントを残す