Subversion はツリーの構造を追いかけるのであって、それはファイルの内容 だけにはとどまりません。これはCVSを置き換えるために Subversionが書かれた 大きな理由の一つです。
CVSユーザとしてのあなたに、これが何を意味するかをここで挙げておきます:
svn add と svn delete コマンドは ファイルだけではなく、ディレクトリに対しても動作します。 svn copy とsvn moveもそうです。 しかし、これらのコマンドは、リポジトリに対して直接の変更を加える ことはありません。そのかわりに、作業アイテムは単に、追加または削除 の「予告」 を受けるだけです。svn commit が実行されるまで、リポジトリはいっさい変更されません。
ディレクトリはもう、ただの入れ物ではありません。それはファイルと 同じように、リビジョン番号を持っています。(あるいはもっと適切には 「リビジョン 5 の中にある、ディレクトリfoo/
」という言い方が正しいのですが)。
最後の点についてもっと説明します。ディレクトリのバージョン管理は 難しい問題です。それは、混合リビジョンの作業コピーを認めたいので、 このモデルを乱用することに対する制限が必要になります。
理論的な見地からすると、 「 ディレクトリ foo
の リビジョン 5 」 というのは、ディレクトリエントリと属性の、ある特定のあつまりを 意味します。foo
のファイルを追加したり削除 し、コミットしたとします。リビジョン 5 のfoo
がまだあるといえば嘘になります。しかし、コミット後に foo
のリビジョン番号を上げたとすれば、 これもやはり嘘になります。まだ更新してはいないので、 foo
に、まだ受け取っていないほかの人の変更が 加えられたかも知れないからです。
Subversion はこの問題を、.svn
の領域に コミットされた追加と削除を静かに記録することで取り扱います。 svn updateを実行すると、 すべての変更点がリポジトリに反映され ディレクトリの新しいリビジョン番号は正しく設定されます。 そのため、更新後においてだけ、ディレクトリの「完全な」 リビジョンを手にしている、と安全に言うことができます。 ほとんどの場合、作業コピーは「不完全な」 ディレクトリ リビジョンを含んでいます。
同様にして、もしディレクトリ上の属性変更をコミットしようとした ときに問題が起こります。普通、コミットは作業ディレクトリの ローカルなリビジョン番号を上げます。しかし、やはり、それは 嘘です。というのは、更新がかかっていないことにより、ディレクトリ がまだ受け取っていない追加や削除があるかも知れないからです。 それで、ディレクトリが最新の状態になければ、ディレクトリ上の 属性変更をコミットすることはできません。
ディレクトリのバージョン管理の制限についての詳細は、 混合リビジョン状態の作業コピー項を見てください。