Subversionの機能
Subversion がバージョン管理の問題に提供しようとする機能についての議論は CVS のデザインをどのように改良したかという観点から話しをすることがしばしば有用です。CVS になじみがないのであればこれらのすべての機能を理解する必要はありません。そしてバージョン管理についてまったく知らないのであれば、眠くなるだけかも知れません。まず最初に第2章 基本概念を読んでください。バージョン管理システム一般についての親切な手引きを用意してあります。
Subversion は以下の機能を提供します:
ディレクトリのバージョン化
CVS は個々のファイルの履歴を追うことができるだけですが、 Subversion は時間とともにディレクトリツリー全体の変化も追うことのできる、「仮想的な」バージョン化ファイルシステムを実装しています。ファイルと、さらに ディレクトリもバージョン付けします。
真のバージョン履歴機能
CVS はファイルのバージョン化に機能が制限されているので、コピーや名称変更— これはファイルだけではなくディレクトリの内容も変更する可能性があります— は CVS ではサポートされていません。さらに CVS では古い履歴を継承しなければ同じ名前の全く新しいファイル— おそらく全く無関係のファイル—によってすでにバージョン化されているファイルを置き換えることはできません。 Subversion ではファイルとディレクトリの両者に対して追加、削除、コピー、名称変更をすることができます。そして新規追加されるすべてのファイルは、そこから新しく始まるきれいな履歴を持つことになります。
不分割(Atomic)なコミット
変更点の集まりは、それ全体がリポジトリに完全に反映されるか、まったく反映されないかのどちらかです。これにより開発者は論理的にひとまとまりの変更を作りコミットすることができ、一部だけがリポジトリに反映されてしまうような問題を回避することができます。
バージョン化されたメタデータ
ファイルとディレクトリはそれぞれ関連した属性— キーと値の組のことです— を持つことができます。任意のキー/値の組を生成し保存することができます。属性もファイルの内容と同じようにバージョン化されます。
ネットワーク層の選択
Subversion はリポジトリアクセス用の抽象レイアがあり、新しいネットワークプログラムを簡単に実装できるようになっています。 Subversion は HTTP サーバの拡張モジュールとして組み込むこともできます。こうすると Subversion は信頼性や相互連携性において非常に有利になりサーバが提供している既存の機能をすぐに利用できるようになります—認証、認可、データ圧縮、などです。より簡易なスタンドアロンの Subversion プロセスも利用できます。このサーバは独自のプロトコルによって SSH を利用したトンネル通信を簡単に実行できます。
データ処理の一貫性
Subversion は、バイナリ差分アルゴリズムを使ってファイルの差分を表現します。これはテキスト(読むことのできるデータ)にも、バイナリ( 簡単に読むことのできないデータ)に対しても同じ方法で働きます。どちらのタイプのデータもリポジトリ中に同じ形式で圧縮されて格納され、差分はネットワーク上どちらの方向にも転送されます。
効率的なブランチ、タグの作成
ブランチとタグを作成するコストはプロジェクトのサイズに比例するわけではありません。Subversionはハードリンクとして知られている方法とよく似た方法を使って、単にプロジェクトをコピーすることでブランチとタグを作ります。そのためブランチ、タグの作成は非常に短い、一定の時間しかかかりません。
拡張しやすさ
Subversionは歴史的な遺物ではありません。よく設計された APIでできたCの共有ライブラリの集まりとして実装されています。このことはSubversionの保守をとてもやりやすいものにしますし、他のアプリケーションや言語から利用しやすいものにします。
インストール
Server
rpmでインストールするか、直接にmakeする。簡単。
http://subversion.tigris.org/
#create svn user
useradd svnuser
#make svn root directory
mkdir /var/svnroot
chown svnuser:svnuser svnroot
chmod 775 svnroot
chmod g+s svnroot
#create a project
su - svnuser
cd /var/svnroot
svnadmin create testproject
#add other users to svnuser group
usermod -G svnuser homepage
Client
TortoiseSVN: http://tortoisesvn.tigris.org/
インストールして、explorerで右クリック=>TortoiseSVN=>Setting=>Network=>SSH Clientに"C:\Program Files\TortoiseSVN\bin\TortoisePlink.exe -i id_rsa.ppk"を入力=>OK
id_rsa.ppkはputtyの秘密鍵。
他のSSHクライアントを設定してもいい。
SVNの設定ファイルは"Documents and Settings\Administrator\Application Data\Subversion"(Windows) か "~/.subversion/"(Linux) にある。
設定ファイルconfigに
enable-auto-props = yes
*.pl = svn:eol-style=native;svn:executable
*.pm = svn:eol-style=native;svn:executable
*.cgi = svn:eol-style=native;svn:executable
*.txt = svn:eol-style=native
*.sql = svn:eol-style=native
*.csv = svn:eol-style=native
*.html = svn:eol-style=native
*.htm = svn:eol-style=native
*.tmpl = svn:eol-style=native
*.sh = svn:eol-style=native;svn:executable
*.conf = svn:eol-style=native
を追加する。
コマンド
cvsのコマンドにディレクトリ名の意味は普通ディレクトリのファイル、cvsに
ディレクトリ情報を記録しないから。svnのディレクトリはディレクトリ。
>cd /tmp/project
>ls
main tag branch
>ls main
cgi-bin html lib
import
#cvs
cd main
cvs import -m "test project" testproject vendor_tag release_tag
#svn
svn import /tmp/project svn+ssh://var/svnroot/testproject -m "test project"
checkout
#cvs
cvs checkout testproject
#svn
svn checkout svn+ssh://homepage@hostname/var/svnroot/testproject
update(same)
#cvs
cvs update [filename]
#svn
svn update [filename]
add(same)
#cvs
cvs add filename
#svn
svn add filename
delete(same)
#cvs
cvs rm filename
#svn
svn rm filename
commit(same)
#cvs
cvs commit filename -m "message"
#svn
svn commit filename -m "message"
status
#cvs
cvs status filename
#svn
#check status
svn status filename
#display information
svn info filename
history
#cvs
cvs log filename
cvs history filename
#svn
svn log filename
svn blame filename
difference
#cvs
cvs diff filename
cvs diff -r version1 -r version2 filename
#svn
svn diff filename
svn diff -r version1:version2 filename
svn only
#move
svn move filename new_filename
#copy
svn copy filename new_filename
#mkdir
svn mkdir pathname
#revert
svn revert filename
tag
#cvs
cvs tag tag_name [filename]
#svn
svn copy svn+ssh://homepage@hostname/var/svnroot/testproject/main svn+ssh://homepage@hostname/var/svnroot/testproject/tag/tagname -m "test tag"
#or, this need commit
svn copy main tag/tagname
svn commit -m "test tag"
branch
#cvs
cvs tag -b branch_nmae
#svn. There is no defference between tag and branch in svn.
svn copy svn+ssh://homepage@hostname/var/svnroot/testproject/main svn+ssh://homepage@hostname/var/svnroot/testproject/branch/branchname -m "test branch"
#or, this need commit
svn copy main branch/branchname
svn commit -m "test branch"
merge branch
#cvs
cvs update -j branch_name
#svn
svn merge -r start_branch_version:end_branch_version svn+ssh://homepage@hostname/var/svnroot/testproject/branch/branchname main
#or
svn merge -r start_branch_version:end_branch_version branch/branchname main