Subversion Tips
リポジトリの作成〜日常行う作業についてのメモ。
1. インポート
1-1 リポジトリの作成
まず、ファイルを格納場所(リポジトリ)を作成する。# svnadmin create /home/SV/TestRepos (/home/SVディレクトリはあらかじめ作成しておくこと)
本コマンドを実行すると/home/SV/にTestReposディレクトリが作成される。中を除くとバージョン管理用に幾つかファイルが作成されているのがわかる。SubversionではCVSと異なり、バイナリファイルで管理されるので、リポジトリの中を除いても基本的に意味はわからない。
# ls /home/SV/TestRepos/ README.txt conf dav db format hooks locks
1-2 プロジェクトのインポート
作成したリポジトリにプロジェクトを登録する。svn importコマンドを実行するとエディタが起動するので、メッセージを入力して、エディタを終了するとプロジェクトがリポジトリに登録される。
以下の例ではSampleProgramディレクトリの中身をTestReposリポジトリ中のSampleProgramディレクトリの下にインポートしている。
# svn import SampleProgram file:///home/SV/TestRepos/SampleProgram 追加しています SampleProgram/main.c
リポジトリにインポートされているプロジェクトはsvn listコマンドで確認できる。
# svn list file:///home/SV/TestRepos SampleProgram/
インポートしたプロジェクトは以下のようにして取り出せる。
# svn checkout file:///home/SV/TestRepos/SampleProgram A SampleProgram/main.c リビジョン 1 をチェックアウトしました。
2.運用に関するポリシー
1.で既にリポジトリを作成してしまったが、ここで、リポジトリ内のディレクトリ構成に関して知っておいた方がよいことをまとめる。2-1 リポジトリのレイアウト
リポジトリのレイアウトには大きく分けて、(1) あるリポジトリ内に複数のプロジェクトを格納するケースと (2) プロジェクト毎にそれぞれリポジトリを作成するケースがある。
1つのリポジトリに複数プロジェクトを格納
Repos/ リポジトリ(svnadminで作成) +---SampleProg プロジェクト格納用ディレクトリ +---SampleProg2 プロジェクト格納用ディレクトリ
プロジェクト毎のリポジトリ
SampleProg/ リポジトリ(svnadminで作成) SampleProg2/ リポジトリ(svnadminで作成)
CVSではRevision番号はファイル毎に振られていたが、SubversionではRevision番号はリポジトリに対して1つ振られる。このため、1つのリポジトリに複数のプロジェクトを入れていた場合、あるプロジェクトのソースを変更してもリポジトリとしてはRev番号が上がってしまい関係ないプロジェクトについても変更があったように見えてしまう。
1リポジトリ内に複数プロジェクトを入れるのと1つしか入れないのとどちらがよいかは、一概には言えないが全く関係ないプロジェクト同士であればリポジトリは分けた方が無難と思われる。
2-2 プロジェクト内のディレクトリのレイアウト
CVSと異なりSubversionではブランチ/タグはプロジェクトディレクトリ内にコピーして置くことになるため、プロジェクト内にブランチ/タグを置く場所が必要になる。後で混乱しないようにブランチ/タグをどこに置くかポリシーを決めておいたほうがよい。プロジェクト内のディレクトリ体系はSubversionのリファレンスにもあるように以下のようにプロジェクトディレクトリ直下にtrunk,tags,branchesディレクトリを作って管理するのがお推め。SampleProg/ プロジェクトTop +------trunk/ 本流のソースを格納 +------tags/ タグを格納する為のディレクトリ | +--beta_release/ 作成したタグ | : +------branches/ ブランチを格納する為のディレクトリ +--develop/ 作成したブランチ :
上記のようなディレクトリ構成で運用する場合は、import時にあらかじめ以下のようにtrunk,tags,branchesを作成しておき、trunkに管理したいソースツリーを格納しておく。
# find SampleProg SampleProg <== importするプロジェクトのTopディレクトリ SampleProg/trunk SampleProg/trunk/main.c <== trunk/ 配下にソースをいれておく SampleProg/tags SampleProg/branches # svn import SampleProg file:///home/SV/TestRepos/SampleProg 追加しています SampleProg/trunk 追加しています SampleProg/trunk/main.c 追加しています SampleProg/branches 追加しています SampleProg/tags リビジョン 2 をコミットしました。
3.日常の作業
3-1 チェックアウト
# svn checkout file:///home/SV/TestRepos/SampleProg A SampleProg/trunk A SampleProg/trunk/main.c A SampleProg/branches A SampleProg/tags リビジョン 2 をチェックアウトしました。
上記の手順だとタグやブランチも全て取り出すので、余計なファイルを取り出したくなければ、ブランチ/タグまで指定してcheckoutする。以下はTrunkを取り出す例。
# svn checkout file:///home/SV/TestRepos/SampleProg/trunk SampleProg A SampleProg/main.c リビジョン 2 をチェックアウトしました。
3-2 現在の作業コピーの情報表示
svn infoコマンドでリポジトリの場所や、最後に更新したリビジョンが表示される。# svn info パス: . URL: file:///home/SV/SampleProg/trunk リポジトリ UUID: f55960ad-6812-0410-ba75-d64ba92e87fb リビジョン: 1 ノード種別: ディレクトリ 準備中の処理: 特になし 最終変更者: tomita 最終変更リビジョン: 1 最終変更日時: 2006-04-27 21:27:24 +0900 (木, 27 4月 2006)
3-3 編集内容のcommit
編集内容をリポジトリに反映する場合はsvn commitを行う。ファイル名を指定せずにsvn commitを実行すると、カレントディレクトリ配下のローカル編集済みファイルを全てcommitしようとする。ファイルを指定する場合は、commitの後にファイル名を列挙すればよい。ファイルの追加を行う場合は、commit前にsvn addをしておく必要がある。svn commitを実行するとcommitログを入力するためにエディタが起動するので、ログ入力後エディタを終了すればcommitされる。
#svn commit カレントディレクトリ以下の編集ファイルをcommit #svn commit main.c debug.c
3-4 変更ログの表示
svn logにより、commitした時に入力したログを表示できる。表示されるログは指定したファイルやディレクトリに対するものに限定される。例えばsvn log main.cとファイルを指定したらmain.cに関するログのみ表示される。何も指定しなかった場合は、デフォルトでカレントディレクトリが選択され、カレントディレクトリ配下のファイルに関するログのみ表示される。このため、プロジェクトに関する全てのログを表示したい場合はプロジェクトのトップディレクトリでsvn logを実行する必要がある。main.cに関するログを表示
# svn log main.c
カレントディレクトリ配下のファイルに関するログを表示
# svn log
特定ブランチに関するログを表示
# svn log file:///home/SV/TestRepos/SampleProg/branches/beta_release
プロジェクト全体のログを表示
# svn log file:///home/SV/TestRepos/SampleProg プロジェクトのトップディレクトリを指定する。