1. 機能
    1. ディレクトリのバージョン化
      1. CVS は個々のファイルの履歴を追うことができるだけ
    2. 真のバージョン履歴機能
      1. ファイルとディレクトリの両者に対して追加、削除、コピー、名称変更可能
      2. 追加されるファイルは、そこから新しく始まるきれいな履歴を持つ
    3. 不分割(Atomic) なコミット
      1. 一部だけがリポジトリに反映されてしまうような問題を回避
    4. バージョン化されたメタデータ
      1. 任意のキー/値の組を生成し保存することができる
    5. ネットワーク層の選択
      1. リポジトリアクセス用の抽象レイアがある
    6. データ処理の一貫性
      1. バイナリ差分アルゴリズムを使ってファイルの差分を表現
    7. 効率的なブランチ、タグの作成
      1. ブランチ、タグの作成は非常に短い、一定の時間しかかからない
    8. 拡張しやすさ
  2. 構成
    1. 構成要素
      1. svn
        1. コマンドラインのクライアント
      2. svnversion
        1. 作業コピーの状態についての報告
      3. svnlook
        1. リポジトリを調べる
      4. svnadmin
        1. リポジトリを調整したり修復
      5. svndumpfilter
        1. ダンプファイル形式のデータに対するフィルタ
      6. mod dav svn
        1. Apache HTTP サーバ用のプラグインモジュール
      7. svnserve
        1. スタンドアロンのサーバプログラム
  3. 基本概念
    1. リポジトリ
      1. ファイルの階層構造全体
      2. すべての変更を記録
      3. 単なる仮想的にバージョン化されたファイルシステム
        1. どんなデータも含むことのできる大きなツリー構造
    2. バージョン管理モデル
      1. 共同作業での編集とデータの共有を可能にする
    3. ファイル共有の問題
      1. どうやってユーザに情報を共有させつつ、お互いの変更点が重ならないようにする
      2. 2人が同時に編集する場合
        1. Aを保存し、Bを重ねて保存した場合
        2. Aの変更は履歴として残っている
        3. だが、BはAの変更を見ることはなく編集を完了している
        4. これは望むべき姿ではない
      3. ロック・修正・ロック解除の解法
        1. ファイルを変更できるのは一度に一人だけ
        2. ロックすることから安心感を与えるが、ファイル間に依存性がある場合、不整合は発生する
      4. コピー・修正・マージの解法
        1. Subversion, CVS等、ロックに変わるアイディアとして採用
        2. クライアントは自分だけの作業コピーを作成
        3. 1人1人は作業コピーに対して並行作業
        4. 最後に自分のコピーは新しいバージョンにマージされる
        5. 最終的に正しいマージか否かは人が責任を持つ
          1. コンフリクトはコミュニケーションにより解決
          2. システムがコンフリクトを回避できるという間違った保証に安心する必要はない
        6. テキストファイルである場合を想定
          1. バイナリでは、ロックの必要
    4. 実行中のSubversion
      1. 作業コピー中のディレクトリには.svn という、管理ディレクトリ
      2. checkoutは、自分のためのプロジェクトのコピーを作るだけ
      3. リポジトリへのアクセス
      4. 自分の変更を公開するには commit を行う
      5. リポジトリの内容を自分の作業内容に反映させるには update を行う
      6. リビジョン
        1. commit 操作
          1. 任意の数のファイル、ディレクトリの変更点を公開
          2. それぞれの commit が1トランザクションとして扱われる
        2. リポジトリによる commit の受付
          1. 常にリビジョンと呼ばれるファイルシステムツリーの新しい状態を作る
          2. それぞれのリビジョンには一意な自然数が割り当てられる
          3. リビジョンが追加される様子
        3. グローバルリビジョン番号
          1. Subversion のリビジョン番号は木全体に対して付けられる
        4. 作業コピーの4つの状態
          1. ローカルで変更なし、かつリポジトリで最新
          2. ローカルで変更あり、かつリポジトリで最新
          3. svn commit で変更を公開
          4. ローカルで変更なし、かつリポジトリで最新ではない
          5. svn update でリポジトリをローカルにマージ
          6. ローカルで変更あり、かつリポジトリで最新ではない
          7. svn status コマンドで確認できる
        5. 更新(pull)とコミット(push)は別の処理でお互い干渉しない
          1. svn commit は常に、作業コピーいくつかのリビジョンの混合状態となる
          2. svn status –verbose で確認
          3. 混合リビジョン状態
          4. svn log で変更履歴を表示
  4. 使い方の詳細
    1. インポート
      1. svn import でリポジトリに新しいプロジェクトをインポートできる
    2. リビジョン
      1. リビジョンの特定
        1. リビジョンはリポジトリのスナップショット
        2. 特定には、--revision(-r) の後にほしいリビジョン番号を続ける
      2. リビジョン番号
        1. リポジトリを作ると、最初はリビジョンゼロ
        2. コミットのたびにリビジョン番号は一つずつ大きくなる
        3. コミットが完了した後、クライアントは一番新しいリビジョン番号を知らせる
      3. リビジョンキーワード
        1. --revision スイッチの整数引数のかわりに使うことができる
        2. HEAD
          1. リポジトリにある最新のリビジョン
        3. BASE
          1. 作業コピーにあるファイル、ディレクトリの、「修正元」リビジョン
        4. COMMITTED
          1. ファイル、ディレクトリが変更されたBASE 以前の 最後のリビジョン
        5. PREV
          1. 変更があった最後のリビジョンの直前のリビジョン
      4. リビジョン日付
        1. リビジョン番号やリビジョンキーワードを指定できるところではどこでも、中かっこ、「{ }」の中に日付を入れて指定することが可能
          1. svn checkout --revision {2002-02-17}
          2. Subversion はその日付に一番近いリビジョン
    3. 最初のチェックアウト
      1. ローカルにリポジトリの作業コピーができる
        1. HEAD (最新のリビジョン)
    4. 基本的な作業サイクル
      1. Topic
      2. 作業コピーの更新
        1. U : ファイルは更新(Updated) されました
        2. A : ファイルかディレクトリ は作業コピーに追加されました
        3. D : ファイルかディレクトリは作業コピーから削除されました
        4. R : ファイルかディレクトリは作業コピー中で置き換えられました
        5. G : マージしました
        6. C : コンフリクトしています
      3. 作業コピーに変更を加える
        1. 作業コピーの構成を変えるときにはsvn copy, svn delete, svn move コマンドを使う
        2. 新たにファイルやディレクトリをバージョン管理下におく場合にはsvn add コマンドを使う
        3. それぞれリポジトリに対して変更の予告をし、コミットで確定する
        4. svn mkdir, svn copy, svn move, svn delete の特殊な利用は、作業コピーではなく、URL を直接操作する
      4. 自分の変更点の調査
        1. リポジトリにコミットする前に、自分が何を変更したのかを見ておく
        2. svn status
          1. A : 追加予告
          2. C : 衝突の状態
          3. D : 削除予告
          4. M : 内容は修正されている
          5. R : 内容を置き換えるように準備
          6. X : バージョン化されていないが外部定義に関連付
          7. ? : バージョン管理下にはありません
          8. ! : バージョン管理下にありますが、それは失われているか、不完全
          9. I : バージョン管理下にはなく、svn add, svn import svn status の実行時にはこれを無視
        3. svn diff
          1. unified diff 形式
        4. svn revert
          1. .svn 領域にある「修正元リビジョン」のコピーを上書きすることによって、修正以前の状態に戻す
          2. リポジトリとの通信は不要
      5. 衝突の解消
        1. 衝突が起こると、普通はその解決することができるように三つのことが起こる
          1. マージ可能なタイプのときには更新処理中にC を表示して、そのファイルが「衝突している」ことを知らせる
          2. 衝突マーカ—(衝突を起こした「両方」の内容を区切る特別なテキスト文字列)を重なっている場所に置き、衝突内容を見てわかるようにする
          3. 衝突しているファイルのそれぞれについて、Subversion は最大で三つのバージョン管理対象にはならない特殊なファイルを作業コピーに置く
          4. filename.mine 作業コピーを更新する前に作業コピー中にあったファイル(自分のやった最後の変更が含まれているだけのもの)
          5. filename.rOLDREV 作業コピーを更新する前のBASE リビジョンにあったファイル(最後にした編集の直前にしたチェックアウト時点)
          6. filename.rNEWREV 作業コピーを更新したときにサーバから受け取ったファイルです(リポジトリのHEAD リビジョン)
      6. 変更点のコミット
        1. svn commit コマンドは自分の変更点のすべてをリポジトリに送る
    5. 履歴の確認
      1. svn log : 全般的な情報
      2. svn diff : ファイルがどのように変更されてきたかを表示
      3. svn cat : 特定のリビジョン番号時点でのファイルを抽出し画面に表示
      4. svn list : 任意の指定したリビジョンのファイルやディレクトリを一覧表示
    6. その他のコマンド
      1. svn cleanup : 作業コピーを探して、残ったログを実行し、プロセスのロックを取り除く
      2. svn import : はバージョン管理されていない複数のファイルをリポジトリにコピーし、必要に応じて直ちにディレクトリを作る
  5. ブランチとマージ
    1. ブランチの基本的な概念
      1. 開発の流れが、もう一方と独立して存在しているが、過去にさかのぼれば、同じ履歴を共有
      2. ブランチの作成
        1. svn copy でリポジトリ中のプロジェクトをコピー
        2. 開発の「主系」を /trunk に置く
        3. /branches 領域にブランチを作る
        4. コピーを作る二つの方法
          1. 面倒(概念が明確)な方法
          2. プロジェクトのルートディレクトリを作業コピーにチェックアウト
          3. svn copy コマンドに作業コピーパスを二つ渡す
          4. 簡単な方法
          5. svn copy に引数として直接URL を二つ渡す
          6. コピーは、「ものぐさ方式」
          7. 実際にはデータをコピーしない
          8. ツリーを指し示すような新しいディレクトリを作成(ハードリンク)
          9. ブランチを利用して、新しい作業コピーをチェックアウトできる
      3. マージの基本的な考え方