Apache Subversion (SVN)
バージョン管理ツール
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工程との統合にサードパーティツール依存
- 学習リソースや最新の情報が限定的
- クラウドネイティブ環境との親和性の低さ
参考ページ
- Apache Subversion 公式サイト
- SVN Red Book(公式ドキュメント)
- Apache Subversion GitHub
- TortoiseSVN(Windowsクライアント)
- SVN コマンドリファレンス
書き方の例
リポジトリの作成と基本設定
# リポジトリを作成
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でのチーム機能
# - 統合されたマージツール