atsukanrockのブログ

Microsoft系技術を中心にぼちぼち更新します

SVN標準ディレクトリ構成

はじめに

SVNの標準的なディレクトリ構成の良さが、やっと理解できたのでメモしておく。

上記についての解説は、インターネット上にたくさんあるが、それでは私には良さが理解できなかった。だが、SVN自体のリポジトリSVNで管理されている)を見て、その良さを理解できた。『*The* Subversion Repository』を参照のこと。『README』を読むと、基本的なことがわかる。

ディレクトリ構成図

SVN自体のリポジトリの、ディレクトリ構成の一部を以下に抜粋する。末尾が「/」はディレクトリ、それ以外はファイルを表す。

/
  + README
  + branches/
  |   + 1.0.x/
  |   + 1.4.x/
  |   + 1.4.x-r24119,r24121/
  |   + 1.5.x-issue2489/
  |   + arterm-soc-work/
  |   + issue-2382/
  + tags/
  |   + 0.10.0/
  |   + 1.0.0/
  |   + 1.0.0-beta1/
  + trunk/

REAMEの和訳と補足

ディレクトリ、およびファイルの意味、および特徴を示す。以下で、補足は私の想像であることに注意する。

/trunk/

常に最新のソースコードを格納する。

/branches/

さまざまなbranchを格納する。たとえ、branchでの変更が一部のサブディレクトリだけであっても、branchはtrunkの完全なコピーとする。一般的に、branchでの変更がtrunkにマージされたら、そのbranchは削除される。

(以下、補足)
ただし、SVN自体のリポジトリを見てもわかるように、過去にリリースされたバージョンのメンテナンス用branchは例外であり、削除されないはずである。

/tags/

リリースのスナップショット(以降「tag」)を格納する。運用ルールとして、tagが一度作成されたら、その内容を一切変更しない。もし変更が必要になったら、branches/に移動させて、そこで行う。

補足

/

SVN自体のリポジトリでは、リポジトリのroot直下にtrunk/、branches/、tags/を配置しているが、root直下である必要はない。1つのリポジトリで複数のプロジェクトを管理しても当然よくて、rootから何階層でもサブディレクトリを作成してよい。プロジェクトのルートとなるディレクトリ直下に、trunk/、branches/、tags/のセットを作成すればよい。

/README

SVN自体のリポジトリのように、trunkのコピーの単位の外に、readmeファイルを配置するとわかりやすいと思う。readmeファイルを配置したディレクトリの、運用ルールなどを記述するとよい。

/branches/1.0.x、/branches/1.4.x

それぞれ、Subverionのバージョン1.0、1.4に対するメンテナンス用branchだろう。

おそらく、マイナーバージョンが同じリリースは、互換性を保つようにしているのだと思う。つまり、基本的にはバグフィックスリリースだろう。互換性がないリリースは、マイナーバージョンをインクリメントしているのではないか。

これらは、削除されないbranchだと思う。

/branches/1.4.x-r24119,r24121/、/branches/1.5.x-issue2489/

それぞれ、branch「/branchees/1.4.x/」、「/branchees/1.5.x/」から派生したbranchだと思われる。

branchから派生したbranchには、派生元のbranchの名称をプレフィックスとして付加するという運用ルールなのではないか。たしかにわかりやすい。

これらは、将来的に役目を終えた時点で削除されるbranchだと思う。

/branches/arterm-soc-work/、/branches/issue-2382/

それぞれ、trunkから派生したbranchだと思われる。

trunkから派生したbranchには、プレフィックスを付加しないという運用ルールなのではないか。これで、branchから派生したbranchと見分けがつく。

これらは、将来的に役目を終えた時点で削除されるbranchだと思う。

/tags/0.10.0/、/tags/1.0.0/、/tags/1.0.0-beta1/

それぞれ、SVNのバージョン0.10.0、1.0.0、1.0.0 beta1のスナップショットだろう。

SVN自体のリポジトリでは、tags/にはリリースのtagしか格納されていない。しかし、我々の普段の開発を考えると、リリースがなくてもtagを作成したいタイミングは多々ある。リリースがなくてもtagを作成してよいと思う。ただし、tagの命名には注意が必要だろう。理由は、tagはtrunkからもbranchからも作成されるためだ。tagの基となったのがtrunkなのか、それともbranchなのか、tag名から一目で判断できた方がわかりやすくてよい。

tag名については、どんな場合でも適用できる万能の命名規約を作るのは難しい。理由は、バージョニングポリシーがプロジェクトごとに異なるためだ。プロジェクト発足時には、バージョニングポリシーとbranch名やtag名の命名規約を、速やかに決定すべきだろう。