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共に自分の変更履歴だけが表示され、他のプロジェクトの履歴は表示されないことがわかる。
結論
- リビジョン番号はコミット毎に一意の番号が付けられ、そのとき変更があったフォルダ/ファイルに同じ番号がつく。
- 変更が無かったフォルダ/ファイルのリビジョン番号は更新されない。
- 複数のプロジェクトを管理する場合、個々のプロジェクトのルートフォルダのリビジョン番号で個々のプロジェクトを管理することができる。
- リビジョン番号はリポジトリ全体で共有されているので、複数のプロジェクトでコミットを繰り返すと、個々のプロジェクトでリビジョン番号が飛び飛びになる。
- しかしながら、「変更を加える毎にリビジョンが上がる(連番でないにしても)」という原則は保たれているので、実使用上は問題ないかもしれない。
とりあえず大丈夫そうである。
問題は既存のリポジトリをどうやって(変更履歴を保ったまま)一つにまとめるかだが、「複数のリポジトリ まとめる」でググるといろいろ出てくるので、そこら辺を参考にしよう。