Subversion

Subversionとは
Subversion(サブバージョン)はプログラムのソースコードなどを管理するバージョン管理システムの一つ。
Suvbersionの使い方はCVSによく似ている。コマンドラインで使用する際の主要なコマンド名はCVSと一致するように作られているため、クライアントはCVSからの移行がきわめて容易である。
(Wikipedia)
http://ja.wikipedia.org/wiki/Subversion
Subversion/Subversion早覚え
概要
主に開発者向けのクイックスタート&ケーススタディです。一部管理者向け。
Subversion付属プログラム一式
-svn
-svn version
-svn look
-svn admin
-svn dumpfilter
-mod_dav_svn
-svnserve
Subversionケーススタディー(基礎)
リポジトリの作成
リポジトリとは、データを格納するために利用するデータベースのことである。
svnadminを利用
書式
例
Subversionのリポジトリの標準ディレクトリ構成
Subversionのディレクトリ構成は完全に自由となっているが、全世界で共通の標準構成が存在する。
特に例外条件のない限り、この構成に従うべき。
-ルートディレクトリ
–branches
–tags
–trunk
データ投入
以下の構造のディレクトリをローカルマシンの好きな位置に作成。
-ルートディレクトリ
–branches
–tags
–trunk
—test.txt(内容はaiueo)
svnサーバーに投入
追加しています。
/var/work/branches
/var/work/tags
/var/work/trunk
/var/work/trunk/test.txt
リビジョン1をコミットしました。
リポジトリパスの指定形式は次で説明。
上記の「-m "文字列"」 はコミットコメント。コミット理由を記述する。
コミットとは、ローカルのファイルをリポジトリに送信すること。
リビジョンとは、コミットが完了した時点のリポジトリ全体のバージョン番号(改定履歴番号)のこと。
SVNリポジトリへのローカルファイルの投入が完了した。
リポジトリパスの指定方法
リポジトリはそのアクセス方法によって指定方法が異なる。
-直接アクセス
–file:///
-WebDAV経由
–http
-WebDAV+SSH経由
–https
-svnserveのTCP/IP経由
–svn
-svnserveのTCP/IP+SSH経由
–svn+ssh
Subversionを利用した作業の典型的なサイクル(開発者初級編)
-作業コピーの取得
–リポジトリの最新の状態を、ローカルマシンにコピーする。コピーしたファイル群を作業コピーと呼ぶ。
—ローカルマシンにファイルが一つも存在しない状態でリポジトリからファイルを取得することを、「チェックアウトする」という。
—ローカルマシンにファイルが存在している状態で、リポジトリの変更分をローカルマシンに取り込むことを「アップデート(更新)する」という。
-ファイル修正
–ローカルマシンでファイルを修正する。
-リポジトリへのファイルの反映
–ローカルマシンで修正したファイルをSVNのリポジトリにコミットする。
–一般的に、反映前にアップデートを行った後、コミットを行う。
チェックアウト
ローカルマシンにリポジトリの作業コピーを作成する。
この作業には、svn checkoutコマンドを利用する。
書式
例
A work2/test.txt
リビジョン1をチェックアウトしました。
これで作業コピーの取得が完了した。
ファイルの修正
取得したファイルを修正する。
適当に。
test.txt(変更前)
test.txt(変更後)
aiueo2
作業コピーのアップデート(最新化)
作業コピーのディレクトリ内でsvn updateコマンド
書式
例
U test.txt
リビジョン3を更新しました。
ファイルのコミット
作業コピーのディレクトリ内でsvn commitコマンド
書式
例
送信しています text.txt
ファイルのデータを送信中です。
リビジョン2をコミットしました。
これで基本的なサイクルは終わり。あとは変更の衝突時に手動で修正(マージ)するケースがある(後述)
チェックアウト・アップデート時に表示されるフラグ
svn updateやsvn checkoutを実行したときに表示されるファイル・フォルダ一覧の左側にアルファベットが表示されます。
例
U test.txt
リビジョン3を更新しました。
2行目の「U」
意味
-A:追加されたファイルの受信
-U:更新されたファイルの受信
-D:ファイル削除
-R:ローカルファイルが削除され、新たなファイルで置換された
-G:マージされた
-C:衝突の発生。問題を主導で解決する必要がある。
GとCはあとで説明。
作業コピーの4つの状態
SVNでは、作業コピーに4つの状態がある。
状態によって、次に行うべき作業が異なる。
-作業コピーに変更なし、リポジトリの最新はすべて取得済み
–完全に同期が取れている状態。できる限り細かい単位でこの状態を維持する。
-作業コピーに変更あり、リポジトリの最新はすべて取得済み
–変更分をリポジトリにコミットする。
-作業コピーに変更なし、リポジトリの最新は未取得
–アップデートして作業コピーを最新化する。
-作業コピーに変更あり、リポジトリの最新は未取得
–コミットはエラーとなる(out of dateエラー)
–アップデートはSVNによってマージされ、衝突部分がマークされる(後述)
SVNのオンラインヘルプの表示方法
全体のヘルプを表示
個別のコマンドのヘルプを表示
SVNのリビジョンについて
リビジョン番号でリビジョンを指定
書式
例
リビジョンキーワードでリビジョンを指定
細かいリビジョン番号を指定するのが面倒なケースがいくつかあるので、代わりにリビジョンキーワードが用意されている。
-HEAD
–最新
-BASE
–作業コピーの修正元リビジョン
-COMMITTED
–ファイルが変更された、BASE以前の最後のリビジョン
-PREV
–最新-1
例
リビジョン日付でリビジョンを指定
書式
例
例2
リビジョンを日付で指定すると、SVNは指定日時以前で最新リビジョンを探しにいく。
範囲も可能
svnディレクトリ
作業コピー内の.svnディレクトリは管理用のディレクトリなので、手動で変更してはいけない。
Subversionケーススタディー(中級)
SVNを利用した作業の流れ 中級編
-作業コピーの変更をコミット
-衝突が発生!
-マージする
-コミットする
衝突が発生するケース

+あるファイルを多数の開発者がチェックアウトする。
+開発者Aが変更したファイルをコミットする
+開発者Bが変更したファイルをコミットしようとする。このとき開発者Aの更新に対する衝突が発生する。変更点に重複がある場合、SVNサーバーはうまく変更内容をマージすることができないので、衝突の発生を通知し、処理を終了する。
SVNでの衝突発生後の流れ
-開発者は衝突の内容を確認する。内容により下記のいづれかを選択する。
–自身の変更を破棄する
—svn revert ファイル名
–変更点を手動でマージして、その結果をコミットする
SVNにおける手動マージ作業
コミット時に衝突が通知された場合、まずはアップデートを行います。
C test.txt
リビジョン4を更新しました。
その時点で、作業コピーは以下のようになります
-作業コピーフォルダ
–test.txt ← mineとr4の衝突をマークしたファイル
–test.txt.mine ← 自分が行った修正のファイル
–test.txt.r2 ← 自分が修正を行う前のリビジョンのファイル
–test.txt.r4 ← 他の開発者が修正を行ったリビジョンのファイル
衝突マークの様子
aiiiiueo
=======
aiuuuueo
>>>>>>> .r2
コミット時に衝突が発生した場所に、衝突マーカーという目印がつけられました。
この衝突を解決し、マージ作業のための補助ファイル(.mine, .rXX)を削除してマージしたファイルをコミットすると、マージ作業が終了となります。
補助ファイル(.mine, .rXX)が存在する状況でコミットコマンドを実行しても、必ずエラーとなります。
svn:コミットに失敗しました
svn:test.txtがまだ衝突しています。
履歴の確認
-svn log ログ
-svn diff 差分
-svn cat ファイル内容
-svn list 一覧
他コマンド
-svn cleanup SVNリポジトリを正常で一貫した状態にする
-svn import ディレクトリをリポジトリにインポートする
Subversion/インストール
※Fedora7
※Suvbersion 1.4.3
※mod_dav_svn 1.4.3
※httpd 2.2.6
Subversionのインストール
mod_dav_svn(Apacheとの連携モジュール)のインストール
リポジトリの作成
svnadmin create rep
chown -R apache:apache rep
/etc/httpd/conf.d/subversion.confの設定
認証用モジュールのコメントアウト
めんどくさいから今回は認証なし
設定終わり

