Subversion:バージョン管理システムのチュートリアル

はじめに

はじめの一歩!ソースコード管理に必要なバージョン管理とは では、さまざまなバージョン管理ソフトウェアを紹介しました。CVS(Concurrent Versions System)を使った解説は CVS:バージョン管理システムのチュートリアル をご覧ださい。
今回は、集中型のバージョン管理ソフトウェアの Apache Subversion の環境を構築し、簡単に使い方を解説します。

なお、構築に使用したマシン環境は、下記のとおりです。

項目 内容
OS Windows 7 Ultimate 32bit
IPアドレス 192.168.0.253
Cygwin Setup Version 2.831
VirtualBox 4.3.4 r91027
Vagrant 1.3.5

上記のソフトウェアと環境を使って解説を進めていきますが異なる環境でも同様の操作は可能です。また以下の記事を参考にして仮想環境の構築を解説していますので参考にしてください。

Subversionとは

Subversionは、1990年にリリースされた集中型のCVSに使い勝手が良く似た、集中型のバージョン管理ソフトウェアとして、2000年10月にリリースされました。CVSは、Subversionが登場するまで多くのオープンソースプロジェクトにおいて使用されていましたが、Subversionのリリースによって、集中型バージョン管理ソフトウェアの主流が、Subversionにシフトしたことにより、2008年5月にリリースされたバージョン 1.11.23を最後に新しいバージョンはリリースされていません。このように、Subversionは、登場から現在まで集中型のバージョン管理ソフトウェアの主流としてさまざまなプロジェクトで使用されており、現在も開発が続けられています。Subversionは、CVSに似たコマンドを使用できる事から、CVSからの移行がしやすいバージョン管理ソフトウェアだと言えます。

リポジトリサーバーの構築

リポジトリを管理するリポジトリサーバーを構築します。

BOX起動

前回の記事で作成したBOXを起動し、BOXに接続します。

$ cd /tmp/unix
$ vagrant up
$ vagrant ssh

/bootcamp/wp-content/themes/_btcp/images/svn_beginner01.png
/bootcamp/wp-content/themes/_btcp/images/svn_beginner02.png

Subversionのインストール

CVSと同様に、多くのLinuxディストリビューションではSubversionがインストールされていませんので、パッケージ管理コマンドを使用してインストールします。

$ sudo yum -y install subversion

/bootcamp/wp-content/themes/_btcp/images/svn_beginner03.png

SSHサーバーの設定変更

リモートからSubversionのリポジトリを操作する際に、SSH接続を利用しますが、セキュリティを考慮してSSH公開鍵のみでユーザーを認証するようSSHサーバーの設定を変更します。

この設定後は、SSH公開鍵がvagrantユーザーの認証鍵ファイル(authorized_keys)に登録されていないユーザーからの接続が拒否されます。このため、新たにリモートユーザーの操作を許可するためには、リポジトリサーバーに接続可能なユーザーがSSH認証鍵を認証鍵ファイルに追加する必要があります。

/etc/ssh/sshd_config を下記のとおり編集します。

$ sudo vi /etc/ssh/sshd_config

UsePAN no
PasswordAuthentication no
RSAAuthentication yes
PubkeyAuthentication yes

編集が終了したら、SSHサーバーを再起動します。

$ sudo service sshd restart

/bootcamp/wp-content/themes/_btcp/images/svn_beginner04.png

以上の手順で、リポジトリサーバーの構築が終了します。

Subversionによるバージョン管理

リポジトリサーバーが構築できましたので、バージョン管理を行います。

リポジトリの作成(create)

CVS同様、バージョン管理を行うファイルやフォルダ(以下、オブジェクトと記す)、変更履歴などを格納するリポジトリを作成します。

リポジトリの初期化方法は、CVSではinitコマンドを使用してリポジトリを初期化しましたが、Subversionでは、svnadminを使用してリポジトリを初期化します。

$ svnadmin create /home/vagrant/myrepos

/bootcamp/wp-content/themes/_btcp/images/svn_beginner05.png

実行すると、ホームディレクトリ下にmyreposリポジトリが作成され、バージョン管理に必要なファイルやフォルダが生成されます。

リポジトリに格納されているモジュールを確認します。

リポジトリを作成しただけですので、モジュールが何も格納されていないことがわかります。

$ svn list file:///home/vagrant/myrepos

/bootcamp/wp-content/themes/_btcp/images/svn_beginner06.png

なお、CVSではリポジトリの指定に環境変数CVSROOTを使用できましたが、Subversionでは、セキュリティに配慮し環境変数によるリポジトリの指定はできません。

以上で、リポジトリの初期化が終了します。

モジュールのインポート(import)

バージョン管理の対象となるオブジェクトをモジュールとして登録します。

importコマンドでは、オブジェクトを指定し、リポジトリURL/モジュール/プロジェクトの書式で、リポジトリにインポートします。

今回の場合、下記のとおり指定しています。

項目 内容
バージョン管理の対象 ~/.ssh
リポジトリURL file:///home/vagrant/myrepos
モジュール ssh-config
プロジェクト ssh-vagrant
Vagrant 1.3.5
$ svn import .ssh file:///home/vagrant/myrepos/ssh-config/vagrant -m'First Import'

/bootcamp/wp-content/themes/_btcp/images/svn_beginner07.png

登録された、モジュール、プロジェクト、オブジェクトを確認します。

// モジュール確認
$ svn list file:///home/vagrant/myrepos
// プロジェクト確認
$ svn list file:///home/vagrant/myrepos/ssh-config/
// オブジェクト確認
$ svn list file:///home/vagrant/myrepos/ssh-config/vagrant

/bootcamp/wp-content/themes/_btcp/images/svn_beginner08.png

今回は、理解しやすさを考慮して、リポジトリを作成し、モジュールを登録していますが、Subversionでは、下記のフォルダを含むリポジトリレイアウトを推奨しています。

フォルダ 使用目的
trunk Wメインで使用しているオブジェクトを格納するフォルダ
branchs trunk(幹)をコピーしたフォルダ(枝)
tags 開発の目安や区切りとして作成されるフォルダ

このため、推奨レイアウトを使用したリポジトリの登録とインポートは、下記のようになります。

// svnrepoリポジトリを作成
$ svnadmin create /home/vagrant/svnrepo

// 推奨されるtrunk/branches/tagsフォルダを作成
$ svn mkdir --parents file:///home/vagrant/svnrepo/ssh-config/vagrant/trunk -m'create trunk'
$ svn mkdir --parents file:///home/vagrant/svnrepo/ssh-config/vagrant/branches -m'create branches'
$ svn mkdir --parents file:///home/vagrant/svnrepo/ssh-config/vagrant/tags -m'create tags'

// オブジェクトをtrunkにインポート
$ svn import .ssh file:///home/vagrant/svnrepo/ssh-config/vagrant/trunk -m'First Import'

// リポジトリ確認
$ svn list file:///home/vagrant/svnrepo

/bootcamp/wp-content/themes/_btcp/images/svn_beginner09.png
/bootcamp/wp-content/themes/_btcp/images/svn_beginner10.png

このように、Subversionに登録するオブジェクトは、どのような階層構造であってもインポートすることができます。

また、作成するリポジトリ構成も、こうしなければならない(must)というものでは無く、推奨(recommend)という扱いですから、管理しやすいリポジトリ構成を作成しましょう。
また、CVSと同様に、リポジトリ操作においてメッセージを入力する必要があるmkdir/import/commitなどのコマンドを実行する際に、-mオプションを指定してメッセージを指定していますが、環境変数SVN_EDITORにエディタを指定しておくと、エディタ上で、メッセージを入力することができます。

export SVN_EDITOR=vi

チェックアウト(co)

登録したモジュールを、任意のフォルダ上にチェックアウトします。

$ cd /tmp
$ svn co file:///home/vagrant/myrepos/ssh-config/vagrant

/bootcamp/wp-content/themes/_btcp/images/svn_beginner11.png

CVSと同じようにチェックアウトできますが、CVSの場合、ssh-configフォルダが作成されるのに対して、Subversionでは、vagrantフォルダが作成されてチェックアウトされます。

両方のコマンドを実行して比べてみて下さい。

$ cd /tmp
$ cvs co sh-config/vagrant

承認(commit)

チェックアウトしたモジュール中のファイルを修正し、リポジトリに反映(コミット)します。

$ cd vagrant
$ vi authorized_key
$ svn commit -m'authorized_key update'

/bootcamp/wp-content/themes/_btcp/images/svn_beginner12.png

実行すると、リビジョン1からリビジョン2に変更されたことがわかります。

更新(update)

Subversionによるバージョン管理も、複数名によりリポジトリが更新されて行きますので、自分がチェックアウトしたモジュールを最新版にアップデートする必要があります。

ここでは、別フォルダにチェックアウトしたモジュールをコミットした後、更新しています。

/tmp/workフォルダ上でチェックアウトし、修正後にコミット

$ mkdir -p /tmp/work
$ cd /tmp/work
$ svn co file:///home/vagrant/myrepos/ssh-config/vagrant
$ cd vagrant/
$ vi authorized_keys
$ svn commit -m'commit on work folder'

/bootcamp/wp-content/themes/_btcp/images/svn_beginner13.png

/tmp/vagrant上で更新

$ cd /tmp/vagrant
$ svn update

/bootcamp/wp-content/themes/_btcp/images/svn_beginner14.png

/tmp/work フォルダでチェックアウトしたファイルのリビジョンが、コミットによってリビジョン3に上がり、/tmp/vagrant フォルダでアップデートしたファイルもリビジョン3に更新されたことがわかります。

追加(add)

作業用フォルダにファイルを追加し、リポジトリにコミットします。

ここでは、/tmp/vagrant フォルダ下のファイルを別名(known_hosts)にコピーして、追加(add)の後コミットしています。

$ cd /tmp/vagrant
$ cp authorized_keys known_hosts
$ svn add known_hosts
$ svn commit -m'add known_hosts'

/bootcamp/wp-content/themes/_btcp/images/svn_beginner15.png

次に、/tmp/work/vagrantフォルダ上で、リポジトリを更新すると追加したファイルが取得できます。

$ cd /tmp/work/vagrant
$ svn update

/bootcamp/wp-content/themes/_btcp/images/svn_beginner16.png

リモートからのバージョン管理

Windows上のCygwin端末から、リポジトリを操作します。

なお、SubversionはCygwinのデフォルトインストールではインストールされませんので、Cygwin + rbenv環境でプロビジョニングサーバーを構築する方法(第1回)~Cygwinを用いて、rbenv環境を構築する を参考にして、Subversionをインストールして下さい。

ssh-agentの準備

リポジトリサーバーに接続可能なSSH公開鍵にパスフレーズが設定されている場合、リポジトリへの操作の度にパスフレーズを要求されますので、ssh-agentを使用してパスフレーズ入力を代替します。

Cygwin端末を起動し、SSH秘密鍵を登録します。

$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa

/bootcamp/wp-content/themes/_btcp/images/svn_beginner17.png

登録の際に、パスフレーズを要求されますので、パスフレーズを入力します。
以上で、ssh-agentの準備が終了します。

チェックアウト(co)

リモートからモジュールをチェックアウトします。

先に設定した、ssh-agentによってパスフレーズを要求されること無く、モジュールのチェックアウトができます。

$ svn co svn+ssh://vagrant@192.168.0.10/home/vagrant/myrepos/ssh-config/vagrant

/bootcamp/wp-content/themes/_btcp/images/svn_beginner18.png

ログ参照(log)

ファイルの変更履歴を表示します。

$ svn log

/bootcamp/wp-content/themes/_btcp/images/svn_beginner19.png

状態表示(status)

自分が変更したファイルを確認します。

CVSのstatusコマンドでは、作業フォルダ上のファイルの状態を表示しましたが、Subversionでは変更したファイルを表示します。

$ svn status

/bootcamp/wp-content/themes/_btcp/images/svn_beginner20.png

変更したファイルがあれば、ファイルの状態を表示します。

変更をコミットすると、何も表示されなくなります。

/bootcamp/wp-content/themes/_btcp/images/svn_beginner21.png
/bootcamp/wp-content/themes/_btcp/images/svn_beginner22.png

モジュールをチェックアウトすると、リポジトリの操作は、モジュールの登録を含め全てローカル上と同じように操作できます。

まとめ

ここまで、Subversionの環境を構築し、簡単な使い方を解説しました。Subversionは、CVSに変わる集中型バージョン管理ソフトウェアとして現在も開発されており、CVSに無い柔軟なリポジトリ構成によって使いやすくなっています。今回紹介したコマンドを使って、バージョン管理にトライしてみましょう。

次回は、git環境の構築と、基本操作の説明をします。

参考記事

リモートリポジトリを使うなら、tracpath(トラックパス)が便利です!下記記事をぜひご参照下さい。
 
■tracpath(トラックパス)を使って、安全に複数名でバージョン管理を行う


社内サーバにリモートリポジトリを作るのも一つですが、「開発にまつわる面倒事」をこの際全部、tracpath(トラックパス)に任せてみませんか?
バージョン管理サービス・プロジェクト管理サービスの「tracpath(トラックパス)」では、
ユーザー5名、リポジトリ数3つまで、無料で利用可能です。

さっそく実務でも使って見ましょう。
自らも開発を行う会社が作ったからこそ、開発チームの「作る情熱」を支える、やるべきことに集中出来るサービスになっています。
エンタープライズ利用が前提のASPサービスなので、セキュリティも強固です。