Locked History Attachments

Subversion

概要

Subversionは最も普及しているバージョン管理システムの1つです。

バージョン管理システムとは、主にソースコードを管理するためのシステムです。 ソースコードは日々の開発の中で更新されていく為、特にチームでの開発を行っているとどうしても次のような状況になってします。

  • 最新版はどこにあるのか?
  • 誰が更新しているのか?
  • 誰が何時更新したのか?
  • 更新を戻したいんだが…

このような「いつ・誰が・どのバージョンを」更新したのかを管理し、運用を間違えなければトラブルを未然に防ぐことが出来ます。 言い換えれば、チーム開発ではバージョン管理システムの導入は必須となります。

初期設定

CentOSではyumでインストールできます。

yum install subversion

リポジトリの作成

リポジトリとはSubversionで管理するファイルのデータを格納するデータベースです。 リポジトリはあるディレクトリ以下のファイルの集まりで構成されています。これらのファイルはディレクトリ毎にコピーすれば簡単にバックアップできる点もSubversionの特徴でしょう。

リポジトリはsvnadminコマンドを使って作成しますが、先ずはどこにどのような名前で作成するかを決める必要があります。

リポジトリの場所

/var/svn/repos

リポジトリの名前

example

# mkdir -p /var/svn/repos/example
# svnadmin create /var/svn/repos/example

リポジトリは幾つでも作成することができます。どこかリポジトリ用のディレクトリを決め(ここでは/var/svn/repos/)、その下にリポジトリを作成すると管理しやすいでしょう。

Apache経由での利用

Subversionは主にファイルのバージョン管理を行う目的で導入する為、自然と様々な端末からアクセスできるようにする必要があります。ネットワーク越しにSubversionを利用する場合は幾つかの方法がとれますが、簡単で応用が利きやすいApache経由での利用方法を説明します。 SubversionとApacheの連携にはmod_dav_svnを使います。yumでインストールしましょう。

# yum install mod_dav_svn

次にApacheのconfファイルを作成します。yumでインストールをすれば、subversion.conf が/etc/httpd/conf.d/に追加されていると思いますので、これを開いて設定を追加しましょう。

<Location /repos>
   DAV svn
   SVNParentPath /var/svn/repos/
</Location>

このように記述すれば、http://hostname/repos/example でリポジトリにアクセスできるようになります。 ※ここに認証の設定もできますが、後述。

セキュリティに関する補足

社内のみでSubversionをApache経由で利用する場合はともかく、インターネット経由で複数の会社が利用する場合などにはセキュリティを考慮する必要があります。特定のIPアドレスからの利用に限定する、SSLを使用するなどの方法で必ずセキュリティを強化してください。

ダイジェスト認証

このままですと、誰でもリポジトリにアクセスできる状態です。社内だけで使用するならばそれでも大丈夫な場合もありますが、誰がコミットしたかなどが追跡できる方が便利です。そこでユーザ名とパスワードによるダイジェスト認証を行うようにします。

htdigest を使ってパスワードファイルを作成し、subversion.confに設定します。 パスワードファイルは、/var/svn/.htdigest としました。

#  htdigest -c .htdigest svn shuji
New password: 
Re-type new password: 
Adding password for user shuji

subversion.conf

<Location /repos>
  DAV svn
  SVNParentPath /var/svn/repos/
  AuthType Digest
  AuthName svn
  AuthUserFile /var/svn/.htdigest
  Require valid-user
</Location>

以上でダイジェスト認証が行われるようになります。

運用

まず、プロジェクトで使用するファイルをどのようなディレクトリ構成で管理するかを決めます。Subversionではtrunk/branches/tagsの3つのディレクトリを作成しておく事が一般的です。

trunk

最新版のファイルを管理

branches

ブランチを管理

tags

タグを管理

タグはある時点でのスナップショット、ブランチは特定のバージョンです。ブランチに関しては最新版を変更しながら、前のバージョンのバグフィックスを行うなど、ソースが2系統に分かれるような場合に更新していきます。

これらをリポジトリの下に配置していきますが、以下のようなルールで運用すると更に便利です。

PROJECT_ROOT

docs

trunk/brances/tags

ドキュメント、資料、画面のモックアップなどを管理

workspace

trunk/brances/tags

プロジェクトで作成するソースコードを管理

share

開発環境など更新されないような共有ツールなどを管理

このような構成のディレクトリを作成して、インポートします。

適当なディレクトリに貼り付けて、上記の構成のディレクトリを作成するスクリプト

REPOS='http://localhost/repos/example'
PROJECT_NAME='example'
USER_NAME='shuji'

mkdir -p ./${PROJECT_NAME}/docs/branches
mkdir -p ./${PROJECT_NAME}/docs/tags
mkdir -p ./${PROJECT_NAME}/docs/trunk
mkdir -p ./${PROJECT_NAME}/share
mkdir -p ./${PROJECT_NAME}/workspace/brances
mkdir -p ./${PROJECT_NAME}/workspace/tags
mkdir -p ./${PROJECT_NAME}/workspace/trunk

svn import --username ${USER_NAME} -m "import project layout." ./${PROJECT_NAME} ${REPOS}

※適当な空のディレクトリを作成して実行してください

運用ルール

バックアップ

ミラーリポジトリ

SVNクライアント

基本操作

Subversionでの操作に関する用語をまとめる。

import

インポート

リポジトリに新たに管理するファイルを追加する操作

checkout

チェックアウト

リポジトリで管理しているファイルをローカルのワークフォルダにコピーする操作

commit

コミット

ローカルのワークフォルダでの変更をリポジトリに反映させる操作

update

アップデート

リポジトリで管理しているファイルの変更をローカルのワークフォルダに反映する操作

export

エクスポート

リポジトリで管理しているファイルをローカルフォルダにコピーする操作

※checkoutしないとcommit/updateが出来ない。exportはローカルに管理用のファイルが作成されない。

チェックアウト

コミット

エクスポート

エクスポートはリポジトリのファイルをローカルフォルダにコピーする。管理情報は作成されない為、アップデート等はできない。

メディアファイルをSVNから取得して更新するサンプル

svn export file:///var/svn/repos/hoge/trunk/media/ /var/site/media/ --force

※forceオプションを使うことで上書き可能