Subversion Tips
Rev.47を表示中。最新版はこちら。
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コマンドを実行するとエディタが起動するので、メッセージを入力して、エディタを終了するとプロジェクトがリポジトリに登録される。# 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.運用に関するポリシー
2-1 リポジトリのレイアウト
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
パス: .
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
プロジェクトのトップディレクトリを指定する。
4.ブランチ/タグ
4-1 ブランチ/タグの設定
Subversionはブランチ/タグは区別がなく単なるファイルの複製でしかない。どちらもsvn copyによりコピーすればよい(コピー先のディレクトリがブランチ名/タグ名となる)。コピーするとファイルがAddされるので、最後に忘れずcommitをすること。ブランチとタグを区別するためにコピー先をディレクトリで分けておくとよい。
ブランチの作成
TrunkからdevBranchブランチを作成
# cd (作業ディレクトリ)
# svn copy trunk branches/devBranch
A branches/devBranch
# svn commit
タグの設定
TrunkにbetaReleaseタグを設定
# cd (作業ディレクトリ)
# svn copy trunk tags/betaRelease
A tags/betaRelease
# svn commit
ブランチのベースRev.(copyした時のRev)を取得したい場合、ブランチのディレクトリで--stop-on-copyオプションを付けてsvn logを実行すればよい。--stop-on-copyを付けるとcopyされた時点より以前のログが表示されなくなるのでベースのRev.を取得できる。以下の例だと、devBranchブランチはr397をベースにsvn copyされていることになる。
# cd branches/devBranch
# svn log --stop-on-copy
<略>
------------------------------------------------------------------------
r399 | kztomita | 2006-06-06 18:31:49 +0900 (火, 06 6月 2006) | 2
lines
xxxx修正
------------------------------------------------------------------------
r398 | kztomita | 2006-06-05 15:39:49 +0900 (月, 05 6月 2006) | 3
lines
新機能開発用ブランチ追加
------------------------------------------------------------------------
#
4-2 変更のマージ
ある変更を作業コピーにマージするにはsvn mergeを使用する。svn mergeはsvn diffと同様に二つのパスの間の差分を取り出す。異なるのはsvn diff は差分を標準出力に出力するのに対し、svn mergeは差分を現在の作業ディレクトリに反映させる点。svn mergeを行っただけでは、作業ディレクトリが更新されるだけでリポジトリは更新されないので、マージした結果は最後にcommitすること。マージ内容に問題があればsvn revertで元に戻せばよい。ブランチの変更内容をTrunkにマージする場合は以下のようにする。以下の例ではbeta_releaseブランチのRev.268以降の変更をTrunkにマージしている。mergeは作業ディレクトリのファイルに対して差分を反映するのであらかじめTrunkの作業ディレクトリにcdするのを忘れないように。
# cd (trunkの作業ディレクトリ)
# svn merge -r 268:HEAD file:///home/SV/TestRepos/SampleProg/
branches/beta_release
# svn commit
マージする際はどのブランチのどのRevをマージしたかをcommitログに残しておくとよい。例えば「beta_releaseブランチの r268〜r300をマージ」という感じで。
4-3 リポジトリの切替え
現在の作業ディレクトリを他のブランチやタグのものに切替えたい場合はsvn switchによりできる。以下はdevBranchブランチへの切替え。# svn switch
file:///home/SV/TestProgram/SampleProg/branches/devBranch
5.その他便利なコマンド
5-1 リポジトリ内のツリーの閲覧
svnlook treeによりリポジトリ内のソースツリーを閲覧できる。# svnlook tree /home/SV/TestRepos
/
SampleProg/
trunk/
main.c
branches/
tags/
6.その他
6-1 リポジトリのバックアップ
svnadmin dumpコマンドによりバックアップを取れる。コマンドを実行すると標準出力に出力されるのでファイルに書き出せばよい。# svnadmin dump /home/SV/TestRepos > repos.bakup
* リビジョン 0 をダンプしました。
* リビジョン 1 をダンプしました。
* リビジョン 2 をダンプしました。
バックアップを戻す場合は、svnadmin loadで採取したバックアップを標準入力から読み込ませてやればよい。リポジトリを別のマシンに移した場合などで、リポジトリが無い場合はsvnadmin createで空のリポジトリを作成してからそこに戻す。
# svnadmin load /home/SV/TestRepos < repos.bakup
<<< オリジナルのリビジョン 1 に基づき、新しいトランザクションを開始しました
:
<略>
:
------- リビジョン 2 をコミットしました >>>
捕捉
Subversionではバイナリでデータベース管理しているため、リポジトリを単にコピーしただけでは、他のアーキテクチャのマシンへの可搬性がない。svnadmin dumpでバックアップすることで、テキスト形式でバックアップされるため、他のマシンへの移行が可能になる。