Apache Subversion (SVN)

バージョン管理集中型DevOpsApacheエンタープライズバイナリファイルレガシーシステム

バージョン管理ツール

Apache Subversion (SVN)

概要

Apache Subversion(SVN)は、Apache Software Foundationが開発する集中型バージョン管理システムです。2000年にCollabNet社によって開始され、CVSの置き換えとして設計されました。単一の中央リポジトリにすべてのバージョン履歴を保存する集中型アーキテクチャにより、バイナリファイルの効率的な管理、アトミックコミット、詳細なアクセス権限制御を実現します。企業環境での長期プロジェクト管理、レガシーシステムの保守、大容量ファイルを含むプロジェクトに特に適しており、安定性と信頼性を重視する組織で継続的に利用されています。

詳細

Subversion 2025年版は、1.5%のマーケットシェアを維持しながら、レガシーシステムや特定の企業環境で重要な役割を果たし続けています。15年以上の開発実績により極めて成熟したシステムとして、Apache 2.0ライセンスの下でオープンソースとして提供されています。集中型アーキテクチャの利点として、すべての履歴情報が単一の信頼できるソースに保存され、管理者による細かいアクセス制御が可能です。FSFS(FileSystem FileSystem)バックエンドによる高速で堅牢なリポジトリストレージ、WebDAVプロトコルによるHTTPアクセス、バイナリファイルの差分管理に優れた特徴を持ちます。

主な特徴

  • 集中型アーキテクチャ: 単一リポジトリによる一元管理と強力なアクセス制御
  • アトミックコミット: トランザクション保証による整合性確保
  • ディレクトリバージョニング: ファイルとディレクトリ構造の両方を管理
  • バイナリファイル対応: 大容量ファイルと差分管理の効率化
  • 詳細な権限管理: パス単位での読み書き権限制御
  • WebDAV統合: HTTP/HTTPSによるリモートアクセス

メリット・デメリット

メリット

  • 1.5%のマーケットシェアながらレガシーシステムで継続利用の実績
  • バイナリファイルの優秀な管理能力と効率的な差分保存
  • 集中型管理による明確な権限制御とセキュリティ
  • アトミックコミットによる高い整合性とロールバック機能
  • 企業環境での長期安定運用実績と成熟したエコシステム
  • Apache Licenseによるオープンソースとしての信頼性

デメリット

  • 分散型VCSと比較してオフライン作業の制限
  • ブランチ・マージ操作がGitほど軽量ではない
  • 新規プロジェクトでの採用は減少傾向
  • モダンなDevOps工程との統合にサードパーティツール依存
  • 学習リソースや最新の情報が限定的
  • クラウドネイティブ環境との親和性の低さ

参考ページ

書き方の例

リポジトリの作成と基本設定

# リポジトリを作成
svnadmin create /path/to/repository

# リポジトリの基本構造作成
svn mkdir file:///path/to/repository/trunk \
         file:///path/to/repository/branches \
         file:///path/to/repository/tags \
         -m "Initial repository structure"

# ワーキングコピーをチェックアウト
svn checkout file:///path/to/repository/trunk ./working-copy
cd working-copy

# グローバル設定
svn config --global-option config auto-props yes
svn config --global-option config enable-auto-props yes

基本的なファイル操作

# ファイルの追加
echo "Hello World" > hello.txt
svn add hello.txt

# ディレクトリの追加
mkdir src docs
svn add src docs

# ファイルの状態確認
svn status
# A    hello.txt
# A    src
# A    docs

# 変更差分の確認
echo "Hello SVN" > hello.txt
svn diff hello.txt

# コミット実行
svn commit -m "Initial commit with basic project structure"

# ファイルの移動・リネーム
svn move hello.txt src/main.txt
svn commit -m "Move hello.txt to src/main.txt"

# ファイルの削除
svn delete obsolete-file.txt
svn commit -m "Remove obsolete file"

ブランチとタグの管理

# 開発用ブランチの作成
svn copy ^/trunk ^/branches/feature-authentication \
    -m "Create feature branch for authentication"

# ブランチに切り替え(チェックアウト)
svn switch ^/branches/feature-authentication

# ブランチでの開発作業
echo "Authentication module" > auth.py
svn add auth.py
svn commit -m "Add authentication module"

# トランクの変更をブランチにマージ
svn merge ^/trunk
svn commit -m "Merge trunk changes to feature branch"

# ブランチをトランクにマージ
svn switch ^/trunk
svn merge ^/branches/feature-authentication
svn commit -m "Merge feature-authentication branch to trunk"

# リリースタグの作成
svn copy ^/trunk ^/tags/release-1.0.0 \
    -m "Tag release version 1.0.0"

# タグの確認
svn list ^/tags/

リモートリポジトリとアクセス権限

# リモートリポジトリからチェックアウト
svn checkout https://svn.example.com/project/trunk project
cd project

# 認証情報の保存
svn checkout --username your_username https://svn.example.com/project/trunk

# SSL証明書の受け入れ
svn checkout https://svn.example.com/project/trunk --trust-server-cert-failures unknown-ca

# リポジトリ情報の確認
svn info

# ログの表示
svn log -v --limit 10
svn log -r HEAD:1 --stop-on-copy

# 特定リビジョンの情報
svn log -r 1234
svn diff -r 1233:1234

プロパティとIgnore設定

# svn:ignore プロパティの設定
svn propset svn:ignore "*.tmp
*.log
node_modules
.env" .

# プロパティの確認
svn proplist -v .

# 実行可能ファイルの設定
svn propset svn:executable on script.sh

# MIME タイプの設定
svn propset svn:mime-type image/png logo.png

# 外部参照(svn:externals)の設定
svn propset svn:externals "libs https://svn.example.com/libraries/trunk
tools https://svn.example.com/tools/tags/stable" .

# プロパティの編集
svn propedit svn:ignore .

高度な操作とトラブルシューティング

# 競合の解決
svn update
# コンフリクトが発生した場合
svn resolve --accept mine-full conflicted-file.txt
# または対話的に解決
svn resolve conflicted-file.txt

# ワーキングコピーのクリーンアップ
svn cleanup

# 特定リビジョンへの巻き戻し
svn merge -r HEAD:1234 .
svn commit -m "Revert to revision 1234"

# ファイルの履歴追跡
svn log --follow-copy renamed-file.txt

# リポジトリの差分比較
svn diff ^/trunk ^/branches/feature-branch

# 部分的な更新
svn update --depth immediates
svn update --set-depth infinity specific-directory

# ロックの管理
svn lock binary-file.bin -m "Editing binary file"
svn unlock binary-file.bin

# リポジトリURLの変更
svn relocate http://old-server.com/svn https://new-server.com/svn

SVNサーバー設定とフック

# Apache設定例(/etc/apache2/sites-available/svn.conf)
# <Location /svn>
#   DAV svn
#   SVNParentPath /var/svn
#   AuthType Basic
#   AuthName "Subversion Repository"
#   AuthUserFile /etc/apache2/svn-auth-users
#   Require valid-user
#   AuthzSVNAccessFile /var/svn/authz
# </Location>

# ユーザー認証ファイルの作成
htpasswd -c /etc/apache2/svn-auth-users username

# 権限設定ファイル(/var/svn/authz)
# [groups]
# developers = alice, bob
# managers = charlie
#
# [/]
# @managers = rw
# @developers = r
#
# [repository:/trunk]
# @developers = rw

# pre-commit フックスクリプトの例
#!/bin/sh
REPOS="$1"
TXN="$2"

# コミットメッセージの長さチェック
SVNLOOK=/usr/bin/svnlook
LOG_MSG=$($SVNLOOK log -t "$TXN" "$REPOS")
if [ ${#LOG_MSG} -lt 10 ]; then
    echo "Commit message must be at least 10 characters long" >&2
    exit 1
fi

# ファイルサイズチェック
MAX_SIZE=10485760  # 10MB
for FILE in $($SVNLOOK changed -t "$TXN" "$REPOS" | grep "^[AU]" | cut -c5-); do
    SIZE=$($SVNLOOK filesize -t "$TXN" "$REPOS" "$FILE")
    if [ "$SIZE" -gt "$MAX_SIZE" ]; then
        echo "File $FILE is too large ($SIZE bytes)" >&2
        exit 1
    fi
done

バックアップとメンテナンス

# リポジトリの完全バックアップ
svnadmin dump /path/to/repository > repository-backup.dump

# 増分バックアップ
svnadmin dump /path/to/repository -r 100:HEAD --incremental > incremental-backup.dump

# バックアップからの復元
svnadmin create /path/to/new-repository
svnadmin load /path/to/new-repository < repository-backup.dump

# リポジトリの整合性チェック
svnadmin verify /path/to/repository

# リポジトリのパック(サイズ最適化)
svnadmin pack /path/to/repository

# 古いリビジョンファイルの削除
svnadmin pack /path/to/repository --clean-logs

# リポジトリ統計の表示
svnadmin info /path/to/repository

TortoiseSVNとGUI操作

# Windows環境でのTortoiseSVN統合
# 右クリックメニューからの基本操作:
# - SVN Checkout: リポジトリからチェックアウト
# - SVN Update: 最新版への更新
# - SVN Commit: 変更のコミット
# - TortoiseSVN > Repo-browser: リポジトリブラウザ
# - TortoiseSVN > Show log: ログビューア

# コマンドラインからTortoiseSVNツール起動
TortoiseProc.exe /command:commit /path:"C:\project"
TortoiseProc.exe /command:log /path:"C:\project"
TortoiseProc.exe /command:diff /path:"C:\project\file.txt"

# Visual Studio統合(AnkhSVN)
# - ソリューションエクスプローラーでの状態表示
# - Team Explorerでのチーム機能
# - 統合されたマージツール