subversionのリビジョン番号の振る舞い

今までプロジェクト毎に別々のsubversionリポジトリを作って運用していた。(ついでに言うとtrunkとかbranchesの使い分けもしていなかった。)
しかし管理が煩雑になってきたのでリポジトリを一つにまとめることを検討してみた。

複数のプロジェクトを一つのリポジトリで管理する場合、心配なのがリビジョン番号はどういう挙動をするのか? ということだ。
そこで簡単な実験をしてみた。

リポジトリの作成

project1及びproject2をtest_repositoryで管理することを考える。

まずtest_repositoryリポジトリを作成し、チェックアウトする。

チェックアウトしたtest_repository作業コピーの下に以下のファイルを作成する。

test_repository/trunk/project1/a.txt
test_repository/trunk/project2/b.txt

そしてtest_repositoryをコミットする。このときのtest_repositoryの状態をリポジトリブラウザで閲覧すると以下のようになる。

ファイル リビジョン
test_repository/trunk rev1
test_repository/trunk/project1 rev1
test_repository/trunk/project1/a.txt rev1
test_repository/trunk/project2 rev1
test_repository/trunk/project2/b.txt rev1

project1の編集

次に、project1をチェックアウトする。project1/a.txtに書き込み、project1をコミット。
test_repositoryをsvn updateして状態を閲覧する。

ファイル リビジョン
test_repository/trunk rev2
test_repository/trunk/project1 rev2
test_repository/trunk/project1/a.txt rev2
test_repository/trunk/project2 rev1
test_repository/trunk/project2/b.txt rev1


さらにproject1/a2.txtを作成し、project1をコミット。test_repositoryをsvn updateして状態を閲覧する。

ファイル リビジョン
test_repository/trunk rev3
test_repository/trunk/project1 rev3
test_repository/trunk/project1/a.txt rev2
test_repository/trunk/project1/a2.txt rev3
test_repository/trunk/project2 rev1
test_repository/trunk/project2/b.txt rev1

新しく作成されたa2.txtのリビジョンがいきなり3になっているのがわかる。
リビジョン番号はリポジトリへのコミットごとに生成され、変更があったフォルダ/ファイルに割り当てられるようだ。

project2の編集

ここでproject2をチェックアウトし、project2/b.txtを編集する。コミットとアップデートをすると…

ファイル リビジョン
test_repository/trunk rev4
test_repository/trunk/project1 rev3
test_repository/trunk/project1/a.txt rev2
test_repository/trunk/project1/a2.txt rev3
test_repository/trunk/project2 rev4
test_repository/trunk/project2/b.txt rev4

作業コピーのログ

だいたいの振る舞いが分かってきたところで、それぞれの作業コピーのコミットログを見てみる。
test_repositoryのログ

リビジョン: 4 
変更 : /trunk/project2/b.txt

リビジョン: 3
追加 : /trunk/project1/a2.txt

リビジョン: 2
変更 : /trunk/project1/a.txt

リビジョン: 1
追加 : /trunk
追加 : /trunk/project1
追加 : /trunk/project1/a.txt
追加 : /trunk/project2
追加 : /trunk/project2/b.txt

project1のログ

リビジョン: 3
追加 : /trunk/project1/a2.txt

リビジョン: 2
変更 : /trunk/project1/a.txt

リビジョン: 1
追加 : /trunk
追加 : /trunk/project1
追加 : /trunk/project1/a.txt
追加 : /trunk/project2
追加 : /trunk/project2/b.txt

project2のログ

リビジョン: 4
変更 : /trunk/project2/b.txt

リビジョン: 1
追加 : /trunk
追加 : /trunk/project1
追加 : /trunk/project1/a.txt
追加 : /trunk/project2
追加 : /trunk/project2/b.txt

project1、project2共に自分の変更履歴だけが表示され、他のプロジェクトの履歴は表示されないことがわかる。

結論

  • リビジョン番号はコミット毎に一意の番号が付けられ、そのとき変更があったフォルダ/ファイルに同じ番号がつく。
  • 変更が無かったフォルダ/ファイルのリビジョン番号は更新されない。
  • 複数のプロジェクトを管理する場合、個々のプロジェクトのルートフォルダのリビジョン番号で個々のプロジェクトを管理することができる。
  • リビジョン番号はリポジトリ全体で共有されているので、複数のプロジェクトでコミットを繰り返すと、個々のプロジェクトでリビジョン番号が飛び飛びになる。
  • しかしながら、「変更を加える毎にリビジョンが上がる(連番でないにしても)」という原則は保たれているので、実使用上は問題ないかもしれない。

とりあえず大丈夫そうである。
問題は既存のリポジトリをどうやって(変更履歴を保ったまま)一つにまとめるかだが、「複数のリポジトリ まとめる」でググるといろいろ出てくるので、そこら辺を参考にしよう。