SVNリポジトリの作成方法|初心者でも分かる簡単手順


SVNリポジトリの作成方法|初心者でも分かる簡単手順

はじめに:SVNとは何か?なぜ今も使われるのか?

ソフトウェア開発やドキュメント管理の世界で、「バージョン管理」は不可欠な技術です。ファイルの変更履歴を記録し、いつでも過去の状態に戻したり、複数人での共同作業を円滑に進めたりすることを可能にします。現在、バージョン管理システムの主流は「Git」ですが、かつて一世を風靡し、今なお多くの現場で活躍しているのが「Subversion(サブバージョン)」、通称「SVN」です。

SVN (Subversion) とは?

SVNは、2000年に登場した集中型バージョン管理システムです。その名の通り、すべてのファイルとその変更履歴は、中央に設置された一つの「リポジトリ(貯蔵庫)」で一元管理されます。開発者たちは、その中央リポジトリから必要なファイルのコピー(作業コピー)を手元にダウンロードし、編集作業を行います。そして、作業が完了したら、変更内容を中央リポジトリにアップロード(コミット)して、全員で共有します。

このアーキテクチャは、非常に直感的で理解しやすいのが特徴です。

  • リポジトリは一つだけ。 どこが最新の正しい状態か、常に明確です。
  • 操作がシンプル。「サーバーから取得(チェックアウト)」「サーバーに保存(コミット)」という単純なモデルです。
  • 歴史と実績。 長年にわたって利用されており、安定性と信頼性が高いツールです。

Gitとの違いとSVNが選ばれる理由

現代の主流であるGitは「分散型バージョン管理システム」です。各開発者の手元に、履歴を含む完全なリポジトリの複製が存在します。これにより、オフラインでの作業や、より柔軟なブランチ運用が可能になります。

では、なぜGitが主流の今、あえてSVNを学ぶ価値があるのでしょうか?SVNは、特定のユースケースにおいてGitよりも優れた選択肢となることがあります。

  1. シンプルな運用モデル: 集中管理型は、小規模なチームや、バージョン管理に不慣れなメンバーがいる場合に、混乱が少なく、教育コストを低く抑えられます。
  2. 強力なアクセス制御: SVNは、リポジトリ内のディレクトリやファイル単位で、ユーザーごとに細かい読み書き権限を設定することを得意としています。特定の部署には特定のディレクトリしか見せない、といった制御が容易です。
  3. 巨大なバイナリファイルの管理: 設計図(CADデータ)、画像、動画、実行ファイルなど、サイズの大きなバイナリファイルを扱うプロジェクトでは、SVNの方がGitよりも効率的に動作することがあります。Gitは差分管理の仕組み上、巨大なファイルの履歴がリポジトリサイズを肥大化させやすい傾向があります。
  4. 部分的なチェックアウト: プロジェクト全体が巨大であっても、必要なディレクトリだけをチェックアウトして作業することができます。Gitでは、原則としてプロジェクト全体をクローンする必要があります。
  5. 既存の資産: 長年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つのアクセス方法があります。

  1. svn://プロトコル (svnserve):

    • SVN専用の軽量なデーモン(常駐プログラム)svnserveを使用する方法です。
    • メリット: 設定が非常にシンプルで、手軽に始められます。
    • デメリット: 暗号化(SSL/TLS)が標準ではサポートされておらず、SSHトンネリングなど別の仕組みを組み合わせる必要があります。Webブラウザでの閲覧もできません。
    • 用途: クローズドなネットワーク内の小〜中規模プロジェクトに向いています。
  2. http:// / https://プロトコル (Apache httpd + mod_dav_svn):

    • Webサーバーの定番であるApacheに、SVN連携モジュールmod_dav_svnを組み込んでアクセスする方法です。
    • メリット:
      • SSL/TLSによる通信の暗号化(https://)が容易に実現できます。
      • Webブラウザでリポジトリの中身を閲覧できます。
      • LDAPなど、既存の認証基盤と連携しやすいです。
      • より高度で柔軟なアクセス制御が可能です。
    • デメリット: svnserveに比べて設定がやや複雑になります。
    • 用途: セキュリティが重要なプロジェクトや、大規模プロジェクト、不特定多数がアクセスする公開リポジトリなどに向いています。

ここでは、まず手軽な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
“`

【重要】所有権の設定
上記サービスファイルでは、svnservesvnという専用ユーザーで実行するように指定しています。セキュリティ上、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ファイルに設定したuser1password123を入力してください。

無事にチェックアウトできれば、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認証で使うパスワードファイルを作成します。svnservepasswdファイルとは形式が異なり、パスワードは暗号化されます。作成には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.confAuthzSVNAccessFile /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

注意: この設定はsvnservesvn: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が自動でマージ(統合)できなかったことを示すサインです。

  1. 競合の発生: svn update を実行した際に、C (Conflicted) というステータスのファイルが現れます。
  2. 競合ファイルの確認: 競合が発生したファイル(例: text.txt)を開くと、SVNによって以下のようなマーカーが挿入されています。また、text.txt.mine, text.txt.rOLD, text.txt.rNEW といったファイルが自動生成されます。
    <<<<<<< .mine
    これは自分の変更内容です。
    =======
    これはサーバーから来た他の人の変更内容です。
    >>>>>>> .r123
  3. 手動マージ: 開発者自身が、このマーカーを頼りに、どちらの変更を残すか、あるいは両方を取り込むようにファイルを正しく編集します。マーカー (<<<<<, =====, >>>>>) はすべて削除します。
  4. 解決の通知: ファイルの編集が完了したら、SVNに対して「競合は解決しました」と通知する必要があります。

    • TortoiseSVN: 競合したファイルを右クリック → TortoiseSVN →「競合の解決」を選択し、編集後のファイルを選択します。
    • コマンドライン: svn resolved <競合したファイル名> を実行します。
  5. コミット: 解決後、変更内容を通常通りコミットします。


第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:///svn/myproject/trunk -m “Initial project import”
``
この操作の後、
http:///svn/myproject/をチェックアウトすると、trunk`というディレクトリが作成されているはずです。

2. ブランチの作成

trunkでの開発中に、大きな機能追加(feature-x)が必要になったとします。trunkを汚さずに作業するため、ブランチを作成します。これはsvn copyコマンドで実行します。

“`bash

trunk の最新リビジョンを branches/feature-x にコピーする

svn copy http:///svn/myproject/trunk \
http:///svn/myproject/branches/feature-x \
-m “Create branch for feature-x”
“`
これはリポジトリ上での操作であり、作業コピーには影響しません。

3. ブランチへの切り替え

ブランチでの作業を開始するには、作業コピーの参照先をtrunkから新しいブランチに切り替えます。これにはsvn switchを使います。

“`bash

現在の作業コピー(trunkをチェックアウトしている)を

feature-xブランチに向ける

svn switch http:///svn/myproject/branches/feature-x
``
これで、この作業コピーでのコミットは
feature-x`ブランチに対して行われるようになります。

4. ブランチのマージ

feature-xブランチでの開発が完了したら、その成果をtrunkに統合(マージ)します。

“`bash

まず、作業コピーをtrunkに戻す

svn switch http:///svn/myproject/trunk

feature-xブランチの変更を、現在の作業コピー(trunk)にマージする

svn merge –reintegrate http:///svn/myproject/branches/feature-x

マージ結果を確認し、問題なければコミットする

svn commit -m “Merge feature-x back to trunk”
``–reintegrate`オプションは、ブランチの全変更を統合する際に使用する特別なマージ方法です。

5. タグの作成

trunkがリリースできる状態になったら、記念のスナップショットとしてタグを作成します。これもsvn copyを使います。

“`bash

trunk の最新リビジョンを tags/release-1.0 としてコピーする

svn copy http:///svn/myproject/trunk \
http:///svn/myproject/tags/release-1.0 \
-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の知識によって、よりスムーズで効率的なものになることを心から願っています。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール