SVNリポジトリの作成方法|初心者でも分かる簡単手順
はじめに:SVNとは何か?なぜ今も使われるのか?
ソフトウェア開発やドキュメント管理の世界で、「バージョン管理」は不可欠な技術です。ファイルの変更履歴を記録し、いつでも過去の状態に戻したり、複数人での共同作業を円滑に進めたりすることを可能にします。現在、バージョン管理システムの主流は「Git」ですが、かつて一世を風靡し、今なお多くの現場で活躍しているのが「Subversion(サブバージョン)」、通称「SVN」です。
SVN (Subversion) とは?
SVNは、2000年に登場した集中型バージョン管理システムです。その名の通り、すべてのファイルとその変更履歴は、中央に設置された一つの「リポジトリ(貯蔵庫)」で一元管理されます。開発者たちは、その中央リポジトリから必要なファイルのコピー(作業コピー)を手元にダウンロードし、編集作業を行います。そして、作業が完了したら、変更内容を中央リポジトリにアップロード(コミット)して、全員で共有します。
このアーキテクチャは、非常に直感的で理解しやすいのが特徴です。
- リポジトリは一つだけ。 どこが最新の正しい状態か、常に明確です。
- 操作がシンプル。「サーバーから取得(チェックアウト)」「サーバーに保存(コミット)」という単純なモデルです。
- 歴史と実績。 長年にわたって利用されており、安定性と信頼性が高いツールです。
Gitとの違いとSVNが選ばれる理由
現代の主流であるGitは「分散型バージョン管理システム」です。各開発者の手元に、履歴を含む完全なリポジトリの複製が存在します。これにより、オフラインでの作業や、より柔軟なブランチ運用が可能になります。
では、なぜGitが主流の今、あえてSVNを学ぶ価値があるのでしょうか?SVNは、特定のユースケースにおいてGitよりも優れた選択肢となることがあります。
- シンプルな運用モデル: 集中管理型は、小規模なチームや、バージョン管理に不慣れなメンバーがいる場合に、混乱が少なく、教育コストを低く抑えられます。
- 強力なアクセス制御: SVNは、リポジトリ内のディレクトリやファイル単位で、ユーザーごとに細かい読み書き権限を設定することを得意としています。特定の部署には特定のディレクトリしか見せない、といった制御が容易です。
- 巨大なバイナリファイルの管理: 設計図(CADデータ)、画像、動画、実行ファイルなど、サイズの大きなバイナリファイルを扱うプロジェクトでは、SVNの方がGitよりも効率的に動作することがあります。Gitは差分管理の仕組み上、巨大なファイルの履歴がリポジトリサイズを肥大化させやすい傾向があります。
- 部分的なチェックアウト: プロジェクト全体が巨大であっても、必要なディレクトリだけをチェックアウトして作業することができます。Gitでは、原則としてプロジェクト全体をクローンする必要があります。
- 既存の資産: 長年SVNで運用されてきたプロジェクトは数多く存在し、それらをメンテナンスするためにはSVNの知識が必須となります。
この記事では、そんなSVNのサーバーを自身で構築し、リポジトリを作成し、基本的な操作を行うまでの一連の流れを、初心者の方でもつまずかないように、一つひとつ丁寧に解説していきます。Linuxサーバーでの構築をメインに説明しますが、Windowsでの選択肢にも触れていきます。この記事を読み終える頃には、あなたは自信を持ってSVNリポジトリを管理・運用できるようになっているでしょう。
第1章:SVN環境の準備
リポジトリを作成する前に、まずはSVNを利用するための環境を整える必要があります。SVNは「サーバー」と「クライアント」の2つの要素で構成されます。
- サーバー: リポジトリを格納し、クライアントからの要求に応えるコンピュータ。
- クライアント: サーバーに接続し、ファイルのチェックアウトやコミットといった操作を行うコンピュータ。
ここでは、サーバーサイドとクライアントサイド、それぞれの準備手順を解説します。
サーバーサイドの準備
SVNサーバーは、LinuxやWindowsなど、主要なOS上で構築できます。この記事では、安定性と実績から、Linuxディストリビューションの一つである Ubuntu Server を例に解説を進めます。CentOSやWindowsでの手順も補足します。
必要なソフトウェアのインストール
1. Linux (Ubuntu) の場合
Ubuntuでは、apt
というパッケージ管理ツールを使って、非常に簡単にSVNサーバーソフトウェアをインストールできます。
まず、ターミナルを開き、パッケージリストを最新の状態に更新します。
bash
sudo apt-get update
次に、Subversion本体と、後ほど解説するApacheと連携させるためのモジュールをインストールします。
bash
sudo apt-get install subversion libapache2-mod-dav-svn
subversion
がSVNのコア機能、libapache2-mod-dav-svn
がWebサーバーであるApacheを通じてSVNにアクセスするためのモジュールです。
インストールが完了したか確認するために、バージョン情報を表示してみましょう。
bash
svn --version
バージョン番号などが表示されれば、サーバーサイドのソフトウェアインストールは完了です。
2. Linux (CentOS / RHEL) の場合
CentOSやRed Hat Enterprise Linux (RHEL) では、yum
または dnf
というパッケージ管理ツールを使います。
bash
sudo yum install subversion mod_dav_svn
こちらも同様に、svn --version
でインストールを確認できます。
3. Windows の場合
WindowsでSVNサーバーを構築する場合、いくつかの選択肢があります。
- VisualSVN Server: 最も簡単で推奨される方法です。SVNサーバー、管理ツール、Apacheサーバーがオールインワンになったパッケージで、GUIのウィザードに従うだけで、セキュリティ設定を含めたサーバー構築が完了します。商用利用でも無償のStandard Editionがあり、非常に便利です。
- CollabNet Subversion Edge: こちらも同様に、管理機能が充実したオールインワンパッケージです。
- 手動でのインストール: Apache HausのようなApacheディストリビューションと、ApacheLoungeで配布されている
mod_dav_svn
モジュール、そして公式のSubversionバイナリを個別にダウンロードして設定する方法もありますが、非常に煩雑なため初心者にはお勧めしません。
Windows環境の方は、特別な理由がなければ VisualSVN Server を利用するのが最も確実で簡単な道です。公式サイトからインストーラーをダウンロードし、画面の指示に従ってインストールしてください。
クライアントサイドの準備
次に、サーバーに接続して実際に作業を行うクライアント側のPCに、SVNクライアントソフトウェアをインストールします。
1. Windows の場合: TortoiseSVN
WindowsにおけるSVNクライアントのデファクトスタンダードは「TortoiseSVN」です。エクスプローラー(ファイルブラウザ)に統合され、右クリックメニューから全てのSVN操作を直感的に行えるようになります。
公式サイト (tortoisesvn.net) から、お使いのWindowsのビット数(64-bit/32-bit)に合ったインストーラーと、日本語言語パックをダウンロードしてインストールしてください。インストール後、PCを再起動すると、エクスプローラーの右クリックメニューに「SVN チェックアウト」「SVN コミット」といった項目が追加されます。
2. macOS の場合
macOSにはいくつかの選択肢があります。
- Homebrew: パッケージ管理ツールであるHomebrewを使っている場合、最も簡単です。
bash
brew install subversion - Xcode Command Line Tools: Xcode(Appleの開発ツール)のコマンドラインツールをインストールすると、
svn
コマンドが含まれています。 - GUIクライアント: SnailSVN (Finder統合型) や Cornerstone (高機能なスタンドアロン型、有償) といったGUIクライアントもあります。
3. Linux の場合
Linuxデスクトップ環境では、サーバーと同様にパッケージ管理ツールでインストールします。
“`bash
Ubuntu/Debian系
sudo apt-get install subversion
CentOS/Fedora系
sudo yum install subversion
“`
これで、サーバーとクライアント、両方の準備が整いました。いよいよリポジトリの作成に進みます。
第2章:SVNリポジトリの作成【基本編:ローカルアクセス】
環境が整ったところで、SVNの中心である「リポジトリ」を作成します。リポジトリとは、プロジェクトの全ファイルと、そのすべての変更履歴を格納するデータベースのようなものです。
この章では、まず最も基本的なsvnadmin
コマンドを使ってリポジトリを作成し、その構造を理解することから始めます。
リポジトリ格納用ディレクトリの作成
まず、作成するリポジトリをどこに保存するかを決め、そのためのディレクトリを作成します。慣例的に/var/svn
や/srv/svn
、/home/svn
などが使われます。ここでは/var/svn
を使用します。
bash
sudo mkdir /var/svn
このディレクトリは、後ほどSVNサーバープロセスやApacheプロセスが読み書きするため、適切な所有権とパーミッションを設定することが非常に重要です。この設定を怠ると、アクセスエラーの原因になります。
(具体的な所有権の設定は、第3章でサーバーの起動方法を決めるときに再度行います。)
svnadmin create
コマンドによるリポジトリ作成
それでは、myproject
という名前の新しいプロジェクトのためのリポジトリを作成してみましょう。svnadmin create
コマンドを使用します。
bash
sudo svnadmin create /var/svn/myproject
これだけでリポジトリの作成は完了です。非常に簡単ですね。
エラーが表示されなければ、/var/svn/myproject
ディレクトリが作成され、その中にSVNリポジトリとして機能するためのファイル群が自動的に生成されています。
作成されたリポジトリのディレクトリ構造
ls -l /var/svn/myproject
コマンドで、作成されたリポジトリの中身を見てみましょう。以下のようなディレクトリとファイルが生成されているはずです。
conf/
: リポジトリのアクセス制御やユーザー認証に関する設定ファイルを格納するディレクトリ。このディレクトリが最も重要です。db/
: ファイルデータやリビジョン履歴などの実データを格納するデータベースディレクトリ。この中身を直接編集してはいけません。hooks/
: コミット時など、特定のアクションの前後に自動実行されるスクリプト(フックスクリプト)を置くディレクトリ。例えば、コミット時に自動でテストを実行する、などの処理を実装できます。locks/
: ファイルのロック情報を管理するディレクトリ。format
: リポジトリのフォーマットバージョンを示すファイル。README.txt
: このリポジトリについての簡単な説明ファイル。
リポジトリの構成ファイル(conf
ディレクトリ)
最も重要なconf
ディレクトリの中身を見てみましょう。以下の3つのファイルがデフォルトで用意されています。
svnserve.conf
:svnserve
という専用サーバープログラムでリポジトリを公開する際の、全体的な設定を行うファイルです。匿名アクセスの可否、認証方法、使用する認証ファイルなどを指定します。passwd
:svnserve
でユーザー認証を行う際の、ユーザー名とパスワードを定義するファイルです。authz
: 「Authorization(認可)」の略で、リポジトリ内のどのディレクトリに、どのユーザー(またはグループ)がアクセスできるかを定義する、アクセス制御リスト(ACL)ファイルです。これはsvnserve
でもApache経由のアクセスでも利用できます。
これらのファイルは、次の章でネットワーク経由でアクセスできるように設定する際に、詳しく編集していきます。
ローカルアクセス (file:///
プロトコル) での動作確認
この時点ではまだネットワークサーバーは起動していませんが、リポジトリを作成したマシン上であれば、「file:///
」というプロトコルを使って直接リポジトリにアクセスできます。これを使って、リポジトリが正しく作成されているか確認してみましょう。
適当な作業用ディレクトリ(例: /tmp/mywork
)を作成し、そこに先ほど作成したリポジトリをチェックアウトしてみます。チェックアウトとは、リポジトリから作業用のコピーを手元に作成する操作です。
“`bash
作業用ディレクトリを作成
mkdir /tmp/mywork
チェックアウトを実行
svn checkout file:///var/svn/myproject /tmp/mywork
“`
Checked out revision 0.
のようなメッセージが表示されれば成功です。/tmp/mywork
ディレクトリが作成されていますが、中身は空のはずです。これは、まだリポジトリに何もファイルがコミットされていないためです。
試しに、何かファイルを追加して、最初のコミットをしてみましょう。
“`bash
作業コピーのディレクトリに移動
cd /tmp/mywork
新しいファイルを作成
touch sample.txt
作成したファイルをバージョン管理の対象に追加
svn add sample.txt
“A sample.txt” と表示される
変更内容をリポジトリにコミット
-m はコミットメッセージを指定するオプション
svn commit -m “Initial commit of sample.txt”
“`
Committing transaction...
Committed revision 1.
といったメッセージが表示されれば、最初のコミットは成功です。これで、リポジトリにはsample.txt
というファイルがバージョン1として記録されました。
ここまでで、SVNリポジトリの「入れ物」が正しく機能していることが確認できました。次の章では、このリポジトリにネットワーク経由でアクセスできるように、サーバーを設定・起動していきます。
第3章:SVNサーバーの起動とネットワークアクセス【実践編】
ローカルでのリポジトリ作成が完了したら、次はいよいよチームメンバーがネットワーク経由でアクセスできるようにSVNサーバーを構成します。SVNには、主に2つのアクセス方法があります。
-
svn://
プロトコル (svnserve):- SVN専用の軽量なデーモン(常駐プログラム)
svnserve
を使用する方法です。 - メリット: 設定が非常にシンプルで、手軽に始められます。
- デメリット: 暗号化(SSL/TLS)が標準ではサポートされておらず、SSHトンネリングなど別の仕組みを組み合わせる必要があります。Webブラウザでの閲覧もできません。
- 用途: クローズドなネットワーク内の小〜中規模プロジェクトに向いています。
- SVN専用の軽量なデーモン(常駐プログラム)
-
http://
/https://
プロトコル (Apache httpd + mod_dav_svn):- Webサーバーの定番であるApacheに、SVN連携モジュール
mod_dav_svn
を組み込んでアクセスする方法です。 - メリット:
- SSL/TLSによる通信の暗号化(
https://
)が容易に実現できます。 - Webブラウザでリポジトリの中身を閲覧できます。
- LDAPなど、既存の認証基盤と連携しやすいです。
- より高度で柔軟なアクセス制御が可能です。
- SSL/TLSによる通信の暗号化(
- デメリット:
svnserve
に比べて設定がやや複雑になります。 - 用途: セキュリティが重要なプロジェクトや、大規模プロジェクト、不特定多数がアクセスする公開リポジトリなどに向いています。
- Webサーバーの定番であるApacheに、SVN連携モジュール
ここでは、まず手軽なsvnserve
方式から詳しく解説し、次に高機能なApache方式についても説明します。
方法1:svnserve
を使ったサーバー構築
svnserve.conf
の設定
まず、リポジトリのconf
ディレクトリにあるsvnserve.conf
ファイルを編集します。
bash
sudo nano /var/svn/myproject/conf/svnserve.conf
ファイルを開くと、多くの行が #
でコメントアウトされています。[general]
セクションにある以下の行のコメントを解除し、値を設定します。
“`ini
[general]
匿名ユーザー(ログインしていないユーザー)のアクセス権限を設定します。
‘read’, ‘write’, ‘none’ が指定できます。セキュリティ上 ‘none’ が推奨です。
anon-access = none
認証済みユーザーのアクセス権限を設定します。
‘write’ にすると、読み書き両方が可能になります。
auth-access = write
ユーザー名とパスワードを定義するファイルへのパスを指定します。
このファイルからの相対パスです。
password-db = passwd
パスベースのアクセス制御ファイルを指定します。
このファイルからの相対パスです。
authz-db = authz
認証ダイアログに表示される領域名を指定します。
プロジェクト名などを設定すると分かりやすいです。
realm = My First Project Repository
“`
上記のように編集して、ファイルを保存します。
passwd
ファイルの設定
次に、ユーザーを定義するためにpasswd
ファイルを編集します。
bash
sudo nano /var/svn/myproject/conf/passwd
[users]
セクションに、ユーザー名 = パスワード
の形式でユーザーを追加します。
“`ini
[users]
harry = harryssecret
sally = sallyssecret
user1 = password123
user2 = anotherpassword
“`
注意: このファイルに書かれたパスワードは平文で保存されます。svnserve
をインターネットに公開する場合は、ファイアウォールで特定のIPアドレスからのみアクセスを許可するなど、十分なセキュリティ対策が必要です。
authz
ファイルの設定
最後に、ディレクトリごとのアクセス権限を設定するauthz
ファイルを編集します。
bash
sudo nano /var/svn/myproject/conf/authz
このファイルは非常に強力で、SVNの大きな利点の一つです。
“`ini
[groups]
ユーザーをグループにまとめることができます。
例: admin グループに user1 を所属させる
admins = user1
developers グループに user1 と user2 を所属させる
developers = user1, user2
[/] はリポジトリのルートディレクトリを意味します。
* = r は、全ユーザーに読み取り(r)を許可するという意味です。
@admins = rw は、adminsグループに読み書き(rw)を許可するという意味です。
[/]
@admins = rw
* = r
特定のディレクトリ(例: /docs)に対する権限を設定できます。
この例では、docsディレクトリは全ユーザーが読み取り専用になります。
[/docs]
* = r
特定のディレクトリ(例: /secrets)へのアクセスを制限します。
この例では、user2 はアクセスできなくなります。
[/secrets]
user1 = rw
user2 =
“`
authz
ファイルの基本的な書式は以下の通りです。
* [groups]
セクションで groupname = user1, user2, ...
のようにグループを定義します。
* [リポジトリ名:パス]
または [パス]
で権限を設定したい場所を指定します。
* user = rw
や @groupname = r
のように、ユーザーまたはグループ(@
を付ける)に権限を割り当てます。
* r
: 読み取り (Read)
* w
: 書き込み (Write)
* rw
: 読み書き (Read/Write)
* 空欄: アクセス禁止
ここでは、シンプルにuser1
に全ての読み書き権限を与え、user2
には読み取り専用権限を与える設定をしてみましょう。
“`ini
[groups]
グループは使わないので空でもOK
[/]
user1 = rw
user2 = r
“`
設定が完了したら、ファイルを保存します。
svnserve
の起動とサービス化
設定が完了したので、svnserve
をデーモンとして起動します。
“`bash
-d: デーモンモード(バックグラウンドで実行)
-r /var/svn: リポジトリのルートディレクトリを指定。
これにより、クライアントは svn:///myproject のようにリポジトリ名を指定してアクセスできる。
sudo svnserve -d -r /var/svn
“`
このコマンドでsvnserve
が起動しますが、サーバーを再起動すると停止してしまいます。サーバー起動時に自動でsvnserve
が起動するように、systemdサービスとして登録しましょう。
/etc/systemd/system/svnserve.service
というファイルを新規作成します。
bash
sudo nano /etc/systemd/system/svnserve.service
以下の内容を記述します。
“`ini
[Unit]
Description=Subversion server
After=network.target
[Service]
Type=forking
ExecStart=/usr/bin/svnserve -d -r /var/svn –pid-file=/run/svnserve.pid
ExecStop=/bin/kill -s HUP $MAINPID
User=svn
Group=svn
PIDFile=/run/svnserve.pid
[Install]
WantedBy=multi-user.target
“`
【重要】所有権の設定
上記サービスファイルでは、svnserve
をsvn
という専用ユーザーで実行するように指定しています。セキュリティ上、rootユーザーでサービスを動かし続けるのは避けるべきです。
まず、svn
ユーザーとグループを作成します。
bash
sudo groupadd svn
sudo useradd -r -g svn -d /var/svn -s /sbin/nologin svn
次に、リポジトリディレクトリ全体の所有者をsvn
ユーザーとsvn
グループに変更します。
bash
sudo chown -R svn:svn /var/svn
これで、svn
ユーザーがリポジトリファイルを問題なく読み書きできるようになります。
サービスファイルをシステムに認識させ、自動起動を有効にし、サービスを開始します。
“`bash
systemdに新しいサービスファイルをリロードさせる
sudo systemctl daemon-reload
サーバー起動時に自動でsvnserveが起動するようにする
sudo systemctl enable svnserve.service
svnserveサービスを開始する
sudo systemctl start svnserve.service
サービスの状態を確認
sudo systemctl status svnserve.service
“`
Active: active (running)
と表示されれば成功です。
ファイアウォールの設定
最後に、外部からsvnserve
に接続できるように、ファイアウォールの設定を変更します。svnserve
はデフォルトでTCPポート 3690 を使用します。
Ubuntuでufw
を使用している場合:
bash
sudo ufw allow 3690/tcp
CentOSでfirewalld
を使用している場合:
bash
sudo firewall-cmd --permanent --add-port=3690/tcp
sudo firewall-cmd --reload
クライアントからの接続テスト
これでサーバーの準備は万端です。クライアントPCから接続してみましょう。
TortoiseSVNを使っている場合は、適当なフォルダで右クリックし、「SVN チェックアウト」を選択します。
コマンドラインの場合は、svn checkout
コマンドを実行します。
- リポジトリのURL:
svn://<サーバーのIPアドレスまたはホスト名>/myproject
- チェックアウト先のディレクトリ: 任意の空のフォルダ
実行すると、ユーザー名とパスワードを尋ねるダイアログが表示されます(またはコンソールで聞かれます)。passwd
ファイルに設定したuser1
とpassword123
を入力してください。
無事にチェックアウトできれば、svnserve
によるサーバー構築は成功です!
方法2:Apache httpd + mod_dav_svn
を使ったサーバー構築
次に、より高機能でセキュアなApache経由でのアクセス方法を解説します。
(第1章でlibapache2-mod-dav-svn
はインストール済みとします。)
Apacheの設定ファイル編集
ApacheでSVNを公開するための設定ファイルを作成します。
bash
sudo nano /etc/apache2/mods-available/dav_svn.conf
このファイルに、以下のように記述します。
“`xml
# このLocationブロックで/svnというURLパスへのアクセスを設定する
# WebDAVを有効にし、SVNプロトコルを喋れるようにする
DAV svn
# 複数のリポジトリを公開するための親ディレクトリを指定
# この設定により http://<server>/svn/myproject のようにアクセスできる
SVNParentPath /var/svn
# パスベースのアクセス制御を有効にする
SVNPathAuthz on
# 認証方式をBasic認証に指定
AuthType Basic
# 認証ダイアログに表示されるメッセージ
AuthName "Subversion Repository"
# ユーザー名とパスワードが書かれたファイルへのパス
AuthUserFile /etc/apache2/dav_svn.passwd
# パスベースのアクセス制御ファイル(authz)のパス
# svnserveと共通のファイルを利用できる
AuthzSVNAccessFile /var/svn/authz
# 有効なユーザー(パスワードファイルに存在するユーザー)のみアクセスを許可
Require valid-user
“`
パスワードファイルの作成
ApacheのBasic認証で使うパスワードファイルを作成します。svnserve
のpasswd
ファイルとは形式が異なり、パスワードは暗号化されます。作成にはhtpasswd
コマンドを使用します。
最初のユーザーを作成するときは-c
オプション(create)を付けてファイルを新規作成します。
“`bash
user1を新規作成
sudo htpasswd -c /etc/apache2/dav_svn.passwd user1
New password: と聞かれるのでパスワードを入力(2回)
“`
2人目以降のユーザーを追加するときは-c
オプションは付けません。
“`bash
user2を追加
sudo htpasswd /etc/apache2/dav_svn.passwd user2
“`
authz
ファイルの共有
dav_svn.conf
でAuthzSVNAccessFile /var/svn/authz
と指定しました。これは、複数のリポジトリで共通のauthz
ファイルを使う設定です。
各リポジトリ(例: /var/svn/myproject/conf/authz
)に個別の設定を持たせることもできますが、共通化する方が管理が楽な場合が多いです。
ここでは、svnserve
用に作成した/var/svn/myproject/conf/authz
を共通ファイルとして/var/svn/authz
にコピーまたは移動しておきましょう。
bash
sudo cp /var/svn/myproject/conf/authz /var/svn/authz
所有権の設定
Apacheは、通常www-data
というユーザーで動作します。そのため、Apacheがリポジトリディレクトリを読み書きできるように、所有者をwww-data
に変更する必要があります。
bash
sudo chown -R www-data:www-data /var/svn
注意: この設定はsvnserve
のsvn:svn
という所有権設定と競合します。svnserve
とApacheを同時に同じリポジトリに対して使うことはできません。どちらか一方の方式を選んでください。
Apacheの有効化と再起動
設定を有効にするために、必要なモジュールを有効化し、Apacheを再起動します。
“`bash
dav, dav_svn, authz_svn モジュールを有効化
sudo a2enmod dav dav_svn authz_svn
設定を反映させるためにApacheを再起動
sudo systemctl restart apache2
“`
クライアントからの接続テスト
クライアントPCから、今度はhttp://
プロトコルでアクセスしてみます。
- リポジトリのURL:
http://<サーバーのIPアドレスまたはホスト名>/svn/myproject
htpasswd
で設定したユーザー名とパスワードで認証し、チェックアウトができれば成功です。
Webブラウザで同じURLにアクセスすると、リポジトリの中身やリビジョン履歴が閲覧できることも確認してみてください。
HTTPS化の推奨:
本番環境では、通信内容が平文で流れるhttp://
ではなく、SSL/TLSで暗号化されたhttps://
で運用することが強く推奨されます。Let’s Encryptなどを使えば無料でSSL証明書を取得でき、Apacheのmod_ssl
を有効化することで比較的簡単にHTTPS対応が可能です。
第4章:基本的なSVN操作(クライアント編)
サーバーが稼働し始めたら、次はクライアント側での日々の操作に慣れましょう。ここでは、WindowsのGUIクライアント「TortoiseSVN」と、Linux/macOSの「コマンドライン(svn
コマンド)」の両方の操作方法を併記して解説します。
操作 | 概念 | TortoiseSVNでの操作 | コマンドラインでの操作 |
---|---|---|---|
チェックアウト (Checkout) | サーバー上のリポジトリから、自分のPCに作業用のコピーをダウンロードする最初の操作。 | ①空のフォルダを作成 ②フォルダ内で右クリック →「SVN チェックアウト」 ③リポジトリのURLを入力してOK |
svn checkout <リポジトリのURL> [作業ディレクトリ名] 例: svn co http://.../myproject my-work |
更新 (Update) | サーバー上の最新の変更内容を、自分の作業コピーに反映させる。作業を始める前には必ず行うべき。 | 作業コピーのフォルダで右クリック →「SVN 更新」 | 作業コピーのディレクトリ内でsvn update または svn up |
追加 (Add) | 新しく作成したファイルやフォルダを、バージョン管理の対象に加える。これだけではサーバーには反映されない。 | ①ファイル/フォルダを作成 ②対象を右クリック → TortoiseSVN →「追加」 |
svn add <ファイル名/フォルダ名> 例: svn add new_document.txt |
コミット (Commit) | 自分の作業コピーで行った変更(追加、修正、削除など)を、サーバー上のリポジトリに反映させる操作。 | ①作業コピーのフォルダで右クリック →「SVN コミット」 ②変更内容を確認し、コミットメッセージを入力してOK |
svn commit -m "ここにコミットメッセージを書く" または svn ci -m "..." |
削除 (Delete) | バージョン管理されているファイルやフォルダを削除する。これもコミットするまでサーバーには反映されない。 | ①対象を右クリック → TortoiseSVN →「削除」 ②その後、親フォルダをコミット |
svn delete <ファイル名/フォルダ名> 例: svn del old_file.txt |
状態確認 (Status) | どのファイルが変更・追加・削除されたかなど、作業コピーの状態を確認する。 | ファイルやフォルダのアイコンオーバーレイ(緑のチェック、赤の感嘆符など)で一目瞭然。 「変更をチェック」で詳細表示も可。 |
svn status または svn st M:修正, A:追加, D:削除, ?:未管理 |
差分確認 (Diff) | ファイルのどの部分がどのように変更されたか、具体的な差分を確認する。 | 対象ファイルを右クリック → TortoiseSVN →「差分」 | svn diff <ファイル名> |
ログ表示 (Log) | 誰が、いつ、何を、なぜ変更したのか、コミットの履歴(リビジョンログ)を確認する。 | 作業コピーのフォルダで右クリック → TortoiseSVN →「ログを表示」 | svn log |
競合 (Conflict) の解決
複数人で同じファイルの同じ箇所を編集してコミットしようとすると、「競合 (Conflict)」が発生します。これはSVNが自動でマージ(統合)できなかったことを示すサインです。
- 競合の発生:
svn update
を実行した際に、C (Conflicted)
というステータスのファイルが現れます。 - 競合ファイルの確認: 競合が発生したファイル(例:
text.txt
)を開くと、SVNによって以下のようなマーカーが挿入されています。また、text.txt.mine
,text.txt.rOLD
,text.txt.rNEW
といったファイルが自動生成されます。
<<<<<<< .mine
これは自分の変更内容です。
=======
これはサーバーから来た他の人の変更内容です。
>>>>>>> .r123 - 手動マージ: 開発者自身が、このマーカーを頼りに、どちらの変更を残すか、あるいは両方を取り込むようにファイルを正しく編集します。マーカー (
<<<<<
,=====
,>>>>>
) はすべて削除します。 -
解決の通知: ファイルの編集が完了したら、SVNに対して「競合は解決しました」と通知する必要があります。
- TortoiseSVN: 競合したファイルを右クリック → TortoiseSVN →「競合の解決」を選択し、編集後のファイルを選択します。
- コマンドライン:
svn resolved <競合したファイル名>
を実行します。
-
コミット: 解決後、変更内容を通常通りコミットします。
第5章:リポジトリの推奨レイアウトとブランチ・タグ運用
最後に、より実践的なリポジトリの運用方法について解説します。プロジェクトを開始する際、リポジトリの初期構成をどうするかは非常に重要です。SVNでは、古くから推奨されている標準的なディレクトリレイアウトがあります。
標準的なディレクトリレイアウト
リポジトリを作成したら、その直下にいきなりファイルを置くのではなく、以下の3つのディレクトリを作成することが強く推奨されています。
/trunk
: 「幹」を意味し、プロジェクトのメインの開発ラインとなる場所です。常に安定していて、いつでもリリースできる状態を目指します。日々の開発は、主にこのtrunk
に対して行われます。/branches
: 「枝」を意味し、メインライン(trunk)から分岐した並行開発用の場所です。例えば、大規模な新機能の開発、実験的な試み、特定の顧客向けのカスタマイズなど、trunk
に直接影響を与えずに作業を進めたい場合に使います。/tags
: 「札」を意味し、プロジェクトの特定の時点のスナップショットを保存する場所です。「バージョン1.0」「2.0-beta」など、リリースした時点の状態をそのままの形で保存しておくために使います。タグの中身は、一度作成したら変更しないのが原則です。
なぜこのレイアウトが良いのか?
SVNにおけるブランチやタグは、Gitのように特殊な仕組みではなく、実は単なる「ディレクトリのコピー」です。SVNはコピー操作を非常に効率的に(ディスク容量をほとんど消費せずに)行えるため、この仕組みが成り立っています。
この trunk
, branches
, tags
というレイアウトに従うことで、
- リポジトリの目的が明確になり、見通しが良くなる。
- 各種ツール(CIツールやビューアなど)がこの構造を前提に作られていることが多く、連携がスムーズになる。
authz
によるアクセス制御がしやすくなる(例:tags
ディレクトリは特定のユーザーしか書き込み不可にする)。
といったメリットがあります。
初期インポートとブランチ・タグの基本操作
1. 初期プロジェクトのインポート
まず、既存のプロジェクトのソースコードをtrunk
にインポートします。
“`bash
my-project-code というディレクトリにソースコードがあると仮定
これをリポジトリの /trunk にインポートする
svn import my-project-code http://
``
http://
この操作の後、をチェックアウトすると、
trunk`というディレクトリが作成されているはずです。
2. ブランチの作成
trunk
での開発中に、大きな機能追加(feature-x)が必要になったとします。trunk
を汚さずに作業するため、ブランチを作成します。これはsvn copy
コマンドで実行します。
“`bash
trunk の最新リビジョンを branches/feature-x にコピーする
svn copy http://
http://
-m “Create branch for feature-x”
“`
これはリポジトリ上での操作であり、作業コピーには影響しません。
3. ブランチへの切り替え
ブランチでの作業を開始するには、作業コピーの参照先をtrunk
から新しいブランチに切り替えます。これにはsvn switch
を使います。
“`bash
現在の作業コピー(trunkをチェックアウトしている)を
feature-xブランチに向ける
svn switch http://
``
feature-x`ブランチに対して行われるようになります。
これで、この作業コピーでのコミットは
4. ブランチのマージ
feature-x
ブランチでの開発が完了したら、その成果をtrunk
に統合(マージ)します。
“`bash
まず、作業コピーをtrunkに戻す
svn switch http://
feature-xブランチの変更を、現在の作業コピー(trunk)にマージする
svn merge –reintegrate http://
マージ結果を確認し、問題なければコミットする
svn commit -m “Merge feature-x back to trunk”
``
–reintegrate`オプションは、ブランチの全変更を統合する際に使用する特別なマージ方法です。
5. タグの作成
trunk
がリリースできる状態になったら、記念のスナップショットとしてタグを作成します。これもsvn copy
を使います。
“`bash
trunk の最新リビジョンを tags/release-1.0 としてコピーする
svn copy http://
http://
-m “Tagging release version 1.0”
“`
これで、いつでもバージョン1.0の時点のソースコードを正確に取り出すことができます。
おわりに
この記事では、バージョン管理システムSVNについて、その概要と現代における存在価値から始まり、サーバー環境の構築、リポジトリの作成、2つの主要なサーバー公開方法(svnserve
とApache)、そしてクライアントでの基本的な操作、さらには実践的なブランチ・タグ運用まで、一通りの流れを網羅的に解説しました。
コマンドの羅列だけでなく、なぜその設定が必要なのか(パーミッションや所有権)、どのような選択肢があるのか(svnserve
vs Apache)、そしてチームで運用する上でのベストプラクティス(標準レイアウト)まで踏み込むことで、単なる操作方法の学習に留まらない、実践的な知識を身につけていただけたのではないかと思います。
Gitがデファクトスタンダードとなった現在でも、SVNのシンプルさ、堅牢性、そして強力なアクセス制御は、多くのプロジェクトや組織にとって依然として魅力的な選択肢です。特に、中央集権的な管理が求められる企業内のドキュメント管理や、バイナリファイルを多用する設計・デザインの分野では、その真価を発揮し続けます。
今回学んだ知識は、あなたがSVNで管理されている既存プロジェクトに参加する際の強力な助けとなるだけでなく、新しいプロジェクトでバージョン管理ツールを選定する際に、Git一辺倒ではない、より広い視野を与えてくれるはずです。
SVNには、今回紹介しきれなかったフックスクリプトによる自動化や、プロパティ(svn:keywords
, svn:eol-style
など)を使った高度な設定など、さらに奥深い世界が広がっています。ぜひ、公式ドキュメントなどを参考に、さらなる探求を進めてみてください。
あなたの開発プロジェクトが、このSVNの知識によって、よりスムーズで効率的なものになることを心から願っています。