SVN(Subversion)

概要

集中型VCS リビジョン番号 ブランチ/タグはコピー

Subversion(SVN) は、中央サーバーに履歴を集約する 集中型 バージョン管理システムです。 1つの中央リポジトリに対して、開発者は svn クライアントでチェックアウト/コミットを行います。 典型構成は trunk / branches / tags。コピーは軽量で、タグは不変のスナップショットとして扱うのが慣例です。

✅ チームの権限管理や監査要件が強い、ネットワークが常時つながる環境、巨大バイナリ資産の集中管理などに相性が良いです。

基礎(用語と基本概念)

ワーキングコピー

開発者のローカルにチェックアウトした作業ディレクトリ。メタデータ(.svn)を含み、差分や状態を追跡します。

リビジョン

リポジトリ全体に対して単調増加する「スナップショット番号」。例:r10542

ブランチとタグ

SVNでは「コピー」の仕組みで実現。svn copy はメタデータ的に軽量で、高速です。

典型レイアウト

repo/
  trunk/
  branches/
    feature-x/
    release-1.0/
  tags/
    v1.0.0/

最低限のフロー

  1. チェックアウト:svn checkout URL
  2. 編集・追加:svn add
  3. 確認:svn status
  4. コミット:svn commit -m "msg"
  5. 更新:svn update

基本(よく使うコマンド)

リポジトリのチェックアウト
svn checkout https://example.com/svn/project/trunk project
変更の確認
svn status
svn diff
新規ファイル追加 & コミット
svn add src/main.c
svn commit -m "Add main.c"
ブランチ作成
svn copy ^/trunk ^/branches/feature-x -m "Create branch feature-x"
ブランチへ切替(切替は working copy 単位)
svn switch ^/branches/feature-x
タグ作成
svn copy ^/trunk ^/tags/v1.0.0 -m "Tag v1.0.0"
マージ(例:feature-x → trunk)
svn switch ^/trunk
svn merge ^/branches/feature-x
svn commit -m "Merge feature-x into trunk"
認証情報の削除(クライアント)
svn logout https://example.com/svn

💡 ^/ は「リポジトリルート」を指す SVN の省略記法です。

最新情報(LTS / リリース)

現行の推奨 LTS 系は 1.14 系、最新安定は 1.14.52024-12-08)。セキュリティ修正 CVE-2024-46901 などが含まれます。運用中のサーバ/クライアントは適宜アップデートを検討してください。

🔐 サーバー運用では mod_dav_svn / svnserve の脆弱性に注意。公開直後はディストリ配布待ちの場合があるため、各OSの保守リポジトリも確認を。

応用(実務のベストプラクティス)

  • レイアウト指針: trunk は常にデプロイ可能、安定化は release-x.y ブランチ、機能開発は feature-*
  • レビュー: Pre-commit フックでチェック(禁止ワード、巨大バイナリ、フォーマット)。Post-commit で CI/CD トリガ。
  • 大容量資産: バイナリは svn:needs-lock 属性やロック運用を活用。差分が効かない形式はむやみに履歴を増やさない運用.
  • フック例: 署名メッセージ強制、チケットIDリンク、ブランチ命名規約チェック。
  • バックアップ: svnadmin hotcopy / svnadmin dump の計画実行 + 復元演習。
# pre-commit(例:JIRA チケットID必須)
REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
MSG=$($SVNLOOK log -t "$TXN" "$REPOS")
echo "$MSG" | grep -E "[A-Z]+-[0-9]+" >/dev/null || { 
  echo "コミットメッセージにチケットID(ABC-123 など)が必要です。" 1>&2
  exit 1
}

発展(移行・統合・チューニング)

Git 連携(双方向)

git svn を使うと、SVN リポジトリと Git を橋渡しできます(標準レイアウトは --stdlayout)。

# SVN → Git クローン(標準レイアウト)
git svn clone --stdlayout https://example.com/svn/project project-git
cd project-git
git log --oneline
# 作業後、SVNへ反映
git svn dcommit

注意:巨大履歴の取り込みは時間がかかる場合があります。初期取り込み時は --no-minimize-url 等のオプション検討。

リポジトリ運用

  • FSFS / FSX のストレージ、フックの設計、HTTP/HTTPS(mod_dav_svn)と svnserve の使い分け。
  • 高可用:リバースプロキシ+読み取りレプリカ、バックアップの世代管理。
  • パフォーマンス:差分アルゴリズム・圧縮、フックの外部化、巨大コミットの分割。

(SVN)Subversion VS Git(特性比較)

結論:分散協調やローカル履歴・ブランチ運用の柔軟性は Git、集中管理・一元統制や巨大バイナリのロック運用は SVN が得意。

観点 SVN Git
アーキテクチャ 集中型。中央の単一履歴(権限/監査が単純) 分散型。各ローカルに完全履歴(オフライン強い)
ブランチ/タグ コピーで軽量、タグは慣例的に不変 軽量ブランチ多数が前提、タグは不可変
大容量バイナリ ロック前提の運用が容易(svn:needs-lock LFS 等の追加仕組みが必要
履歴操作 書換えが抑制的(監査に向く) リベース/履歴整形が容易(柔軟)
ネットワーク 常時接続が前提になりやすい ローカルで完結しやすい(高速)
他ツール連携 既存の資産・ツールが豊富(レガシー互換) 最新エコシステムが広い(CI/CD, PR文化)

🔗 補足読書:Perforceの比較記事、Nulabの比較解説、git-svn ドキュメント等。