Subversion によるバージョン管理

Ben Collins-Sussman

Brian W. Fitzpatrick

C. Michael Pilato

Translator:

This work is licensed under the Creative Commons Attribution License. To view a copy of this license, visit http://creativecommons.org/licenses/by/2.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

2006-02-03 14:18(JST) [Revision:N.1906-1] + 13124


目次

まえがき
序文
対象者
この本の読み方
この本での約束ごと
印刷上の規約
アイコン
この本の構成
この本はフリーです
謝辞
Ben Collins-Sussmanより
Brian W. Fitzpatrickより
C. Michael Pilatoより
1. 導入
Subversionって何?
Subversionの歴史
Subversionの機能
Subversion の構成
Subversionのインストール
Subversionの構成要素
クイックスタート
2. 基本概念
リポジトリ
バージョン管理モデル
ファイル共有の問題
ロック・修正・ロック解除の解法
コピー・修正・マージの解法
実行中のSubversion
作業コピー
リビジョン
作業コピーはどのようにリポジトリを追いかけるか
混合リビジョン状態の作業コピー
更新とコミットは別の処理です
混合リビジョンは正常な状態です
混合リビジョンは役にたつものです
混合リビジョンには制約があります
まとめ
3. 同伴ツアー
おたすけを!
インポート
リビジョン: 番号、キーワード、そして、時刻、おやおや・・・
リビジョン番号
リビジョンキーワード
リビジョン日付
最初のチェックアウト
基本的な作業サイクル
作業コピーの更新
作業コピーに変更を加えること
自分の変更点の調査
svn status
svn diff
svn revert
衝突の解消(他の人の変更点のマージ)
衝突を手でマージすること
作業ファイルの上にファイルをコピーすること
Punting: svn revertの利用
変更点のコミット
履歴の確認
svn log
svn diff
ローカルの変更内容の確認
作業コピーとリポジトリの比較
リポジトリとリポジトリの比較
svn cat
svn list
履歴機能について、最後に
その他の役に立つコマンド
svn cleanup
svn import
まとめ
4. ブランチとマージ
ブランチとは?
ブランチの利用
ブランチの作成
自分用のブランチでの作業
ブランチの背後にある鍵となる考え方
ブランチをまたいで変更をコピーすること
特定の変更点のコピー
マージの基本的な考え方
マージの一番うまいやり方
手でマージする方法
マージ内容の確認
マージの衝突
系統(Ancestry)を考慮することと無視すること
典型的な利用方法
ブランチ全体を別の場所にマージすること
変更の取り消し
削除されたアイテムの復活
ブランチの作り方
リリースブランチ
(特定機能の)開発用ブランチ
作業コピーの切り替え
タグ
簡単なタグの作成
複雑なタグの作成
ブランチの管理
リポジトリのレイアウト
データの寿命
まとめ
5. リポジトリの管理
リポジトリの基礎
トランザクションとリビジョンの理解
バージョン化されない属性
リポジトリの保存形式
Berkeley DB
FSFS
リポジトリの作成と設定
フックスクリプト
Berkeley DB の設定
リポジトリの保守
管理者用ツールキット
svnlook
svnadmin
svndumpfilter
Berkeley DB ユーティリティー
リポジトリのお掃除
ディスク領域の管理
リポジトリの復旧
リポジトリの移行
リポジトリのバックアップ
プロジェクトの追加
リポジトリレイアウトの選択
レイアウトの作成と、初期データのインポート
まとめ
6. サーバの設定
概観
ネットワークモデル
要求と応答
クライアント証明のキャッシュ
svnserve, 専用サーバ
サーバの起動
組み込みの認証と認可
ユーザファイルと認証範囲の作成
アクセス制御の設定
SSH 認証と認可
SSH 設定の技法
初期設定
起動コマンドの制御
httpd, Apache HTTP サーバ
必須要件
基本的な Apache の設定
認証オプション
基本 HTTP 認証
SSL 証明書の管理
認可のオプション
全面的なアクセス制御
ディレクトリごとのアクセス制御
パス名にもとづいたチェックの禁止
おまけ
リポジトリ閲覧
その他の機能
複数リポジトリアクセス方法のサポート
7. より進んだ話題
実行時設定領域
設定領域のレイアウト
設定と、Windowsのレジストリ
設定オプション
servers
config
属性
なぜ属性なんてものが?
属性の操作
特殊な属性
svn:executable
svn:mime-type
svn:ignore
svn:keywords
svn:eol-style
svn:externals
svn:special
svn:needs-lock
属性の自動設定
ロック
ロックの作成
ロック状況の調査
ロックの解除と横取り(steal)
ロックのコミュニケーション
ペグ・リビジョンと操作対象リビジョン
外部定義
ベンダーブランチ
一般的な、ベンダーブランチを管理する方法
svn_load_dirs.pl
ローカライゼーション
ロケールの理解
Subversion でのロケール
外部差分ツールの利用
外部 diff
外部 diff3
Subversion リポジトリの URL
8. 開発者の情報
階層化されたライブラリ設計
リポジトリ層
リポジトリアクセス層
RA-DAV (HTTP/DAVを使ったリポジトリアクセス)
RA-SVN (固有のプロトコルによるリポジトリアクセス)
RA-Local (リポジトリへの直接のアクセス)
Your RA Library Here
クライアント層
APIの利用
Apache Portable Runtime ライブラリ
URL と Path の要求
C と C++以外の言語の利用
作業コピー管理領域の内部
Entries ファイル
修正元コピーと属性ファイル
WebDAV
メモリプールを使ったプログラミング
Subversionへの貢献
コミュニティへの参加
ソースコードの取得
コミュニティのやり方に精通すること
コードの変更とテスト
変更点の提供
9. Subversion リファレンス
Subversion コマンドラインクライアント: svn
svn のスイッチ
svn サブコマンド
svn add
svn blame
svn cat
svn checkout
svn cleanup
svn commit
svn copy
svn delete
svn diff
svn export
svn help
svn import
svn info
svn list
svn lock
svn log
svn merge
svn mkdir
svn move
svn propdel
svn propedit
svn propget
svn proplist
svn propset
svn resolved
svn revert
svn status
svn switch
svn unlock
svn update
svnadmin
svnadminスイッチ
svnadmin サブコマンド
svnadmin create
svnadmin deltify
svnadmin dump
svnadmin help
svnadmin hotcopy
svnadmin list-dblogs
svnadmin list-unused-dblogs
svnadmin load
svnadmin lslocks
svnadmin lstxns
svnadmin recover
svnadmin rmlocks
svnadmin rmtxns
svnadmin setlog
svnadmin verify
svnlook
svnlookスイッチ
svnlook
svnlook author
svnlook cat
svnlook changed
svnlook date
svnlook diff
svnlook dirs-changed
svnlook help
svnlook history
svnlook info
svnlook lock
svnlook log
svnlook propget
svnlook proplist
svnlook tree
svnlook uuid
svnlook youngest
svnserve
svnserve スイッチ
svnversion
svnversion
mod_dav_svn
mod_dav_svn 設定ディレクティブ
A. CVSユーザのためのSubversion
リビジョン番号の意味が変わります
ディレクトリのバージョン
切断状態での豊富な操作
状態と更新の区別
ブランチとタグ
メタデータの属性
衝突の解消
バイナリファイルと変換
バージョン管理されたモジュール
認証
CVS から Subversion へのリポジトリ変換
B. WebDAV と、自動バージョン化
WebDAV の基本的な概念
単純な WebDAV
DeltaV 拡張
Subversion と DeltaV
自動バージョン化
クライアントの協調動作
スタンドアロン WebDAV アプリケーション
Microsoft Office, Dreamweaver, Photoshop
Cadaver, DAV Explorer
ファイルエクスプローラの WebDAV 拡張
Microsoft Webfolders
Nautilus, Konqueror
WebDAV ファイルシステムの実装
WebDrive, NetDrive
Mac OS X
Linux davfs2
C. サードパーティー製ツール
D. Copyright

図目次

1.1. Subversion の構成
2.1. 典型的なクライアント/サーバシステム
2.2. 避けなくてはならない問題
2.3. ロック・修正・ロック解除の解法
2.4. コピー・修正・マージの解法
2.5. コピー・修正・マージの解法(続き)
2.6. リポジトリのファイルシステム
2.7. リポジトリ
4.1. 開発のブランチ
4.2. リポジトリレイアウトの開始
4.3. 新しいコピーのあるリポジトリ
4.4. あるファイルの履歴のブランチ化
8.1. 二次元の中のファイルとディレクトリ
8.2. バージョン化した時刻—第三の次元!

表目次

2.1. リポジトリにアクセスするためのURL
5.1. Repository 保存形式の比較
6.1. ネットワークサーバの比較
8.1. Subversionライブラリの一覧
B.1. よく利用される WebDAV クライアント

例目次

5.1. txn-info.sh (未解決トランザクションの表示)
6.1. 匿名アクセスの設定例。
6.2. 認証つきアクセスの設定例。
6.3. 認証つき/匿名の両方でアクセスする場合の設定例。
6.4. Disabling path checks altogether
7.1. レジストリエントリ(.reg) ファイルの例
7.2. diffwrap.sh
7.3. diffwrap.bat
7.4. diff3wrap.sh
7.5. diff3wrap.bat
8.1. リポジトリ層の利用
8.2. Pythonを使ったリポジトリ層
8.3. A Python Status Crawler
8.4. 典型的な.svn/entries ファイル
8.5. 効率的なプールの利用

まえがき

だめな「よくある質問集(FAQ)」には実際にユーザが聞きたいことでは なく、著者がユーザに聞いて欲しいことが書いて あります。おそらく経験があるでしょう:

Q: チームの生産性を最大にするにはどうやって Glorboソフト社の XYZ を使えばよいのでしょう?

A: 顧客の多くは私たちの特許であるオフィスグループ ウェアテクノロジを通じた生産性の向上の方法について知りたいと考えて います。答えは簡単: まず「ファイル」 メニューをクリックし、「生産性 向上」 メニューを選択しましょう、それから …

このような FAQ の問題点は、文字通り FAQ でも何でもないというところ です。技術サポートに電話をして「どうやったら生産性が最大になる のでしょうか?」などと聞く人は一人もいないのです。そうではなく、 本当はもっとずっと具体的な質問がしたいのです、たとえば「どうやったら カレンダーシステムを変更して一日前でなく、二日前に通知するように できますか?」のような。しかし本当の問題点を明らかにするより、 仮想的な FAQ を作るほうがずっとやさしいのです。本当の FAQ を作るには 忍耐強い、組織的な努力が必要なのです: ソフトウェアの一生を通じて やってくる問いを追いかけ、それに対する答えを見守り、それらすべてを 集めて経験の浅いユーザの集約的な経験を反映するように検索可能な形に まとめる必要があります。それは忍耐が必要で、自然主義者のように物事 を黙って観察する態度が必要になります。ここには権威に基づいた仮定や 希望的な観測が入り込む余地はありません—開かれた態度と正確に 物事を記録する態度こそが必要なのです。

この本について私が気に入っているところは、そんな過程を通じて絶えず 本が育っていくところであり、それはすべてのページに現れています。 この本はユーザに対する著者の対峙そのものの結果なのです。それは Subversion メーリングリストで繰り返し問われた基本的な質問を Ben Collins-Sussman が観察することから始まりました: Subversion を使う場合の標準的なワークフローとはいったいどのような ものなのだろうか? ブランチやタグは他のバージョン管理システムと 同じように機能するのだろうか? 誰が特定の変更を加えたということを どうやって把握すればよいのだろうか?

毎日毎日同じ質問を目にすることに強い不満を感じ、Ben は 2002 年の 夏に一ヵ月以上かけて The Subversion ハンドブック を書き上げました。これは 60 ページのマニュアルで、Subversion を利用 する際のすべての基本を扱っていました。マニュアルは完成したような 顔をしませんでしたが、Subversion と共に配布され、学習曲線の最初の 障害を取り除きました。O'Reilly and Associates が完全な Subversion の本を出版しようと決めたとき一番手っ取り早い方法は明らかでした: 単に Subversion ハンドブックを拡張すればよかったのです。

新しい本の三人の共著者は普通ではない幸運に恵まれていました。公式には 彼らの仕事は本をトップダウンに書き下すために目次を作ることからはじめ、 最初の版を作ることでした。しかし彼らはまた確固とした— 確かにそれは制御不能な形でわきあがるような性質のものでしたが— 生の素材に直接触れることもしました。Subversion はすでに何千と言う 初期ユーザの手にあり、それらのユーザは無数のフィードバックをもたらし それは Subversion 本体のみならず、すでに存在しているドキュメントに 対してもそうなのでした。

彼らがこの本を書いている間じゅう、Ben, Mike そして Brian は Subversion メーリングリストとチャットチャンネルをうろつき、 注意深く実際の状況下でユーザが実際に陥る本当の問題を記録してきました。 そのようなフィードバックを監視することは、とにかく CollabNet での彼ら の作業の一部だったわけで、このフィードバックは Subversion をドキュメン ト化する上で非常に有益なものでした。 彼らが書き上げたこの本は、そんな作業を反映しています。しっかりとした 経験を基礎とし、希望的観測に流されず、この本はユーザマニュアルと FAQ の最良の部分をまとめたものです。この二重性は一度読んだだけでは 気がつかないでしょう。順序良く、最初から最後まで、この本はソフトウェア の一片の率直な記述になっています。概略について書かれ、不可欠な同伴 ガイドがあり、管理用設定の章があり、いくつかの進んだトピックに触れ、 そしてもちろんコマンドリファレンスと、障害時の対応法があります。 それは具体的な問題の解法を探しに後で戻ってきてはじめて意味が理解 できるでしょう: そこで語られている詳細は不測の事態に陥った時にしか 関係してきませんし、利用例は本当のユースケースを洗練したものですし ほとんどすべての部分がユーザのニーズとユーザの視点への配慮であふれて います。

もちろん、誰もこの本がSubversion についてのすべての疑問に 答えられるとは約束できる人はいません。質問の期待に、ときどき テレパシーのような精密さで答えることがあるかと思えば、Subversion コミュニティーの知識の中の落とし穴にはまりこんでしまい、手ぶらで 出てくるようなことも、しばしばおこるでしょう。そんな時の一番よい 方法は、にメールを 送って自分の問題を示すことです。著者らはまだそこにいますし、依然と してリストを監視していますし、本の扉に書かれた三人以外にもたくさんの 人が誤りの訂正や最初の資料について貢献してくれています。コミュニティー の観点から言うと、あなたの問題の解決は単にもっとずっと大きなプロジェクト の喜ばしい副作用でしかありません— そのプロジェクトとはつまり、 ゆっくりとこの本の内容を調整し、そして最終的には Subversion そのものが 実際に利用する人々に、より役立つものにすることです。皆は単にあなたを 助けることができるということだけではなく逆に皆を助けるということができる という理由であなたの話しによろこんで耳を貸すでしょう。これはSubversion も 他のすべての活発なフリーソフトウェアプロジェクトでも同じです。 あなたは一人ではないのです

どうかこの本をあなたの最良の共とせんことを。

Fogel Karl, Chicago, 14 March, 2004

序文

If C gives you enough rope to hang yourself, think of Subversion as a sort of rope storage facility.」 —Brian W. Fitzpatrick

オープンソースの世界では、コンカレントバージョン管理システム(CVS) が長い間よく使われてきました。またそれは正しい選択でした。CVSは フリーソフトですし、その制約のないワークフローモデル と、ネットワーク機能のサポート— それは地理的に さまざまな場所に分散したプログラマに作業内容を共有させるものですが— は、オープンソースの世界での共同作業のやり方に非常によく合っています。 CVSと、CVSのある程度ルーズな開発手法モデルは、オープンソース文化のかなめになりました。

しかし、どんなツールでもそうですが、CVSも年をとりました。 Subversionは比較的新しいバージョン管理システムで、CVSの後継となるように 設計されています。設計者は二つの方法で CVSユーザのハートをつかもうとして います。CVSとよく似たデザイン(と、「見栄え」)を持ったオープンソースシステムを 作ることによって、もう一つは、CVSでわかっている欠点のほとんどを 解決しようとすることによって、です。その結果は、バージョン管理システム ソフトの世界に次世代革命をもたらすものではないかも知れませんが、Subversion は確かに とても強力で使いやすく柔軟です。

この本は Subversion バージョン管理システムのバージョン1.2系のために 書かれたものです。私たちはできるだけ完全な記述を目指しましたが、Subversion は 活発で精力的な開発コミュニティーを持ち、既に今後計画されているさまざまな機能や 改良点があるため、この本にあるコマンドや特殊な注意事項のいくつかは変更される かも知れません。

対象者

この本はデータを管理するのにSubversionを使おうとする コンピュータの知識のある人たちのために書かれています。Subversionはいろいろな オペレーティングシステム上で動きますが、一番力を入れているユーザインターフェースは コマンドラインベースのものです。それでこの本で議論したり利用するのもコマンド ラインツール((svn)が対象になります。一貫性を保つためこの 本での例は読者が Unix 風のオペレーティングシステムを利用し、Unix と Unix の コマンドラインインターフェースに比較的慣れていることを前提にしています。

しかしsvnはMicrosoft Windowsのような Unix 以外の プラットフォームでも動かすことができます。バックスラッシュ(\) をスラッシュ (/)のかわりにパス区切り文字として利用しなくては ならないなどの僅かな違いをのぞけば、Windows 上でこのツールを動作させた時の 入力と出力の内容は Unix のものと同一です。しかし、Windows ユーザは Cygwin Unix エミュレータ環境下でこの本の例を実行すれば、よりよい結果を 得られるかも知れません。

ほとんどの読者はおそらくプログラマか管理者で、ソースコードの 変更内容を追う必要のある人になると思います。それが Subversionの 一番普通の使い方なので、この本の例もそういう状況を前提にしています。 ただ、Subversionはどのようなタイプの情報に対しても変更点を管理するのに 使えます。画像、音楽、データベース、ドキュメント、 などなどにも利用できます。Subversionにとっては、どんな種類のデータも、 単なるデータにすぎません。

この本は読者がいままでバージョン管理システムを一度も使ったことは ないものとして書かれていますが、CVSの利用者に対しては、Subversion への 移行を楽にするように工夫しました。しばしば補足としてCVSに触れるかも知れませんし、 特に用意した補遺では、CVSとSubversionの大部分の相違点をまとめて あります。

この本の読み方

この本は非常にさまざまな背景を持った人々にとって有用であることを 目的としています— つまりバージョン管理についてまったく経験のない人から、経験を 積んだシステム管理者までのすべての人たちです。どのような知識を既に持っているか に応じて、特定の章が何らかの意味で重要になるでしょう。以下はさまざまな読者層 ごとの「おすすめの読み方」と考えてください。

経験を積んだシステム管理者

あなたはおそらく既に CVS を利用したことがあり、とっとと Subversion を ダウンロードしてサーバを立ち上げたいのでしょう。第5章 リポジトリの管理第6章 サーバの設定を読めばどのよう にして最初のリポジトリを作り、ネットワーク越しに利用できるようになるかが わかるでしょう。それが済んだら第3章 同伴ツアー付録 A. CVSユーザのためのSubversion をものにするのが CVS 経験者と してのあなたが Subversion クライアントを理解するのに一番早い方法です。

初心者

あなたの管理者は多分もうSubversion を設定しているはずで、あなたに 必要なのはどうやって Subversion クライアントを利用するかを理解する ことだけです。CVS を利用した経験がないのなら(あるいはバージョン管理 システムなどといったものを一度も使ったことがないのなら)、 第2章 基本概念第3章 同伴ツアー は粋な とっかかりになります。既に CVS を使ったことがあるので あれば第3章と補遺A から始めるのが最良でしょう。

より進んだユーザ

ユーザであれ管理者であれ、最終的にはあなたのプロジェクトは大きくなって いくでしょう。そして Subversion のより進んだ機能を理解したくなるはず です。たとえばブランチ化とマージ(第4章 ブランチとマージ)、 メタデータの設定と実行時オプションの設定(第7章 より進んだ話題)、 などなどです。このふたつの章は最初はピンとこないかも知れません が、基本的なことを理解した後でぜひ読んでみてください。

開発者

おそらくあなたは既に Subversion になじんでいて、どうやってそれを拡張するか、 あるいは Subversion のたくさんある API を使ってどうやって新しいソフトウェア を作るかに興味があるでしょう。第8章 開発者の情報はまさにそんな人に うってつけです。

この本のしめくくりはリファレンス情報です—第9章 Subversion リファレンスは、 すべてのSubversionコマンドのリファレンスガイドと、いろいろな役に立つトピック に関する補足情報です。この本全体を一度読み終えたあとで戻ってくる のはきっとこの章でしょう。

この本での約束ごと

ここではこの本で利用されるさまざまな規約について触れます。

印刷上の規約

固定幅

コマンド、コマンド出力、スイッチに使います

イタリックな固定幅

プログラムやテキスト中で置き換え可能なアイテムに対して使います

イタリック

ファイルやディレクトリの名前に使います

アイコン

注意

このアイコンは周りにあるテキストに関連した注意を 表します。

ティップ

このアイコンは周りにあるテキストに関連したヘルプ 情報を表します。

警告

このアイコンは回りにあるテキストに関連した警告を 表します。

ソースコードのサンプルは、単なる一例です. 普通のやり方でコンパイルできるとは思いますが、問題点を簡単に示すためのものであり、 良いプログラミングスタイルの例として載せたものではありません。

この本の構成

以下の章とその内容をここで一覧にしておきます:

第1章 導入

Subversionの歴史、その機能、構成、 構成要素、そしてインストール方法についての章です。またクイック スタートガイドもあります。

第2章 基本概念

バージョン管理の基礎と異なるバージョン管理モデルを、Subversion の リポジトリ、作業コピー、リビジョンとの関連で説明します。

第3章 同伴ツアー

Subversion ユーザとしての日常的な利用方法に沿った説明をします。 Subversion を使ってどのようにデータを取得し、修正し、コミットするか についてのデモンストレーションです。

第4章 ブランチとマージ

ブランチ、マージ、そしてタグについて議論しますが、これにはブランチと マージの最良の方法、一般的な利用例、変更をどうやって取り消すか、 そしてあるブランチから別ブランチにどうやって簡単に乗り換えるかなども 含まれます。

第5章 リポジトリの管理

Subversion リポジトリの基本について議論します。どうやってリポジトリを 作成し、設定し、管理するかについて、また、そのためにどんなツールを 利用できるかについても議論します。

第6章 サーバの設定

Subversion サーバの設定方法と、リポジトリにアクセスする三種類の方法に ついて説明します: HTTPsvn プロトコル、そしてローカルアクセスです。また認証、認可、匿名アクセス についての詳細にも触れます。

第7章 より進んだ話題

Subversion クライアントの設定ファイル、ファイルとディレクトリの 属性、作業コピー中のファイルを無視する方法、 作業コピー中に外部ツリーを含める方法、そして最後にベンダーブランチ の取り扱いについて説明します。

第8章 開発者の情報

Subversion の内部構造、Subversion ファイルシステム、そして作業コピー の管理領域についてプログラマーの視点から説明します。 Subversion を利用するプログラムを書くために公開された API を使う 例をあげ、そして最も大切なことですが、どうやって Subversion の開発に 貢献するかを示します。

第9章 Subversion リファレンス

svnsvnadmin、そしてsvnlook のそれぞれのサブコマンドについてすべてのケースでの豊富な例をまじえながら詳細に 説明します。

付録 A. CVSユーザのためのSubversion

Subversion と CVS の間の類似点と相違点に触れ、CVS を長年使ってきたことによる 悪い習慣からどうやって抜け出すかについてのさまざまなアドバイスをします。 具体的には Subversion のリビジョン番号、バージョン化されたディレクトリ、 オフラインでの操作、updatestatus の違い、ブランチ、タグ、メタデータ、衝突の解消、そして認証です。

付録 B. WebDAV と、自動バージョン化

WebDAVとDeltaVの詳細と、DAV共有を読み書き可能な形にマウントするために どうやってSubversion リポジトリを設定するかを説明します。

付録 C. サードパーティー製ツール

Subversion を支援したり利用したりするツールについて議論します。これには 別のクライアントプログラム、リポジトリ参照ツール、などが含まれます。

この本はフリーです

この本はSubversionプロジェクト開発チームによって書かれたちょっとしたドキュメント から始めたものを、一つにまとめて書き直したものです。そんなわけで、この本は 常にフリーライセンス下にあります(付録 D. Copyrightを参 照してください)。実際、この本は公開された状況のもとで、Subversionの一部として書かれました。 これは二つのことを意味します:

  • この本の最新版は、この本専用のSubversionリポジトリにあります。

  • フリーライセンスの下で、誰でもこの本を好きなように変更し、配布することができます。 もちろんこの本のプライベートバージョンを配布するよりも、Subversion開発チームに パッチの形で送ってもらうほうがずっと助かりますが。 コミュニティへの参加方法についてはSubversionへの貢献の項 を参照してください。

この本の比較的最近のバージョンは、 http://svnbook.red-bean.comにあります。

謝辞

この本は Subversion が存在しなければ不可能でした(し、役に立つものに なることもありませんでした)。そういうわけで、著者はこのようなハイリスク で野心的な新しいオープンソースプロジェクトを支援してくれたBrian Behlendorf とCollabNetにまず感謝します; 次にSubversion の名称とその原型を設計したJim Blandy に対して感謝します— Jim、みな君を愛しているよ; そして最後に 良き友であると同時に偉大なコミュニティー指導者であるKarl Fogelに感謝します。 [1]

O'Reilly と我々の編集者であるLinda Muiと、Tatiana Diaz の忍耐と支援にたいして感謝します。

最後に、この本に対して非公式のレビュー、示唆、修正をしてくれた無数の人々に 感謝します: 確かに完全なリストではありませんが、この本は以下の人々の支援なしに は不完全で不正確なものだったでしょう: Jani Averbach, Ryan Barrett, Francois Beausoleil, Jennifer Bevan, Matt Blais, Zack Brown, Martin Buchholz, Brane Cibej, John R. Daily, Peter Davis, Olivier Davy, Robert P. J. Day, Mo DeJong, Brian Denny, Joe Drew, Nick Duffek, Ben Elliston, Justin Erenkrantz, Shlomi Fish, Julian Foad, Chris Foote, Martin Furter, Dave Gilbert, Eric Gillespie, Matthew Gregan, Art Haas, Greg Hudson, Alexis Huxley, Jens B. Jorgensen, Tez Kamihira, David Kimdon, Mark Benedetto King, Andreas J. Koenig, Nuutti Kotivuori, Matt Kraai, Scott Lamb, Vincent Lefevre, Morten Ludvigsen, Paul Lussier, Bruce A. Mah, Philip Martin, Feliciano Matias, Patrick Mayweg, Gareth McCaughan, Jon Middleton, Tim Moloney, Mats Nilsson, Joe Orton, Amy Lyn Pilato, Kevin Pilch-Bisson, Dmitriy Popkov, Michael Price, Mark Proctor, Steffen Prohaska, Daniel Rall, Tobias Ringstrom, Garrett Rooney, Joel Rosdahl, Christian Sauer, Larry Shatzer, Russell Steicke, Sander Striker, Erik Sjoelund, Johan Sundstroem, John Szakmeister, Mason Thomas, Eric Wadsworth, Colin Watson, Alex Waugh, Chad Whitacre, Josef Wolf, Blair Zajac, そして Subversion コミュニティー全体に対して。

Ben Collins-Sussmanより

Thanks to my wife Frances, who, for many months, got to hear, 「But honey, I'm still working on the book」, rather than the usual, 「But honey, I'm still doing email.」 I don't know where she gets all that patience! She's my perfect counterbalance.

Thanks to my extended family for their sincere encouragement, despite having no actual interest in the subject. (You know, the ones who say, 「Ooh, you're writing a book?」, and then when you tell them it's a computer book, sort of glaze over.)

Thanks to all my close friends, who make me a rich, rich man. Don't look at me that way—you know who you are.

Brian W. Fitzpatrickより

Huge thanks to my wife Marie for being incredibly understanding, supportive, and most of all, patient. Thank you to my brother Eric who first introduced me to UNIX programming way back when. Thanks to my Mom and Grandmother for all their support, not to mention enduring a Christmas holiday where I came home and promptly buried my head in my laptop to work on the book.

To Mike and Ben: It was a pleasure working with you on the book. Heck, it's a pleasure working with you at work!

To everyone in the Subversion community and the Apache Software Foundation, thanks for having me. Not a day goes by where I don't learn something from at least one of you.

Lastly, thanks to my Grandfather who always told me that 「freedom equals responsibility.」 I couldn't agree more.

C. Michael Pilatoより

Special thanks to my wife, Amy, for her love and patient support, for putting up with late nights, and for even reviewing entire sections of this book—you always go the extra mile, and do so with incredible grace. Gavin, when you're old enough to read, I hope you're as proud of your Daddy as he is of you. Mom and Dad (and the rest of the family), thanks for your constant support and enthusiasm.

Hats off to Shep Kendall, through whom the world of computers was first opened to me; Ben Collins-Sussman, my tour-guide through the open-source world; Karl Fogel—you are my .emacs; Greg Stein, for oozing practical programming know-how; Brian Fitzpatrick—for sharing this writing experience with me. To the many folks from whom I am constantly picking up new knowledge—keep dropping it!

Finally, to the One who perfectly demonstrates creative excellence—thank you.



[1] そして、そうだ Karl、君にはこの本のことで、ずいぶん仕事させてしまったね。

第1章 導入

バージョン管理は情報に対する変更を管理するための技法です。 それは小さな変更をソフトウェアにしたあと、次の日にはその変更を取り消すという ような作業をするプログラマにとっては、長い間非常に重要なことでした。 しかしバージョン管理ソフトウェアの有用性はソフトウェア開発の世界をはる かに越えた汎用性があります。頻繁に変更されるような情報を管理しなくては ならないようなコンピュータを使っている人々がいる場所では常にバージョン 管理システムを導入する余地があります。そしてSubversionが力を発揮する のはそのような場所においてです。

この章にはSubversion の高レベルの導入があります—つまりそれは何であり、 何をするものであり、そしてそのためにはどうしたらよいか、についての導入 です。

Subversionって何?

Subversion は、フリーなオープンソースのバージョン管理システムで、 時間とともに変化するファイルやディレクトリを管理します。 ファイルの階層構造全体は、リポジトリと呼ばれる 中心的な場所に置かれます。リポジトリは通常のファイルサーバとよく似ていますが メンバーがファイルやディレクトリにしたすべての変更を記録しています。 このため、メンバーは古いバージョンのデータを戻したり、変更履歴を確認したり することができます。この意味で、バージョン管理システムを、 「タイムマシン」の一種と考える人も います。

Subversion はリポジトリにネットワーク越しにアクセスするので、別々の コンピュータで作業する人々によって利用することができます。ある範囲で それぞれの場所からの同じデータの集まりをさまざまな人が修正し管理する 仕組みは共同作業を支援することができます。すべての変更を一つの流れに そって行うわけではないので作業効率をより高めることができます。 さらに作業はバージョン化されているので、作業品質が流れを中断 するかどうかの兼ね合いであるかどうかを心配する必要はありません— データに対して間違った変更をしてしまった場合には単にそれを取り消せばよい のです。

バージョン管理システムのいくつかは、ソフトウェア構成管理システム(SCM) でもあります。そういうシステムは、ソースコードのツリーを管理するために 特別便利に作られています—たとえばプログラム言語をじかに理解する ことができたり、ソフトウェアを構成するのに必要なツールが付属していたり といった具合です。しかし Subversion はそのような種類のシステムでは ありません。 Subversionはどのような タイプのファイルの集合も管理できる一般的なシステムです。あなたにとって それはプログラムのソースコードかも知れません—しかし別の人にとっては 食料品の買い物リストから、デジタルビデオの編集、そしてもっと他のもの ですらあるでしょう。

Subversionの歴史

2000年の初め、CollabNet, Inc. (http://www.collab.net)は CVS の置き換えを 書く開発者を探し始めていました。CollabNet は CollabNet Enterprise Edition (CEE) [2] という 共同作業用のソフトウェアを提供しています。それはバージョン管理システムをその 一部として含んでいました。CEE は最初のバージョン管理システムと して CVS を利用していましたが、CVS の持っている制限は最初から明らかで あり、CollabNet は最終的にもっと良いものを見つけなくてはならないと悟り ました。不幸にも CVS はオープンソースの世界において 事実上の標準となって いましたが、それは単に、少なくともフリーライセンスの下ではそれより良いも のが何もなかったというのが理由の大部分でした。 そこで CollabNet は一から新しいバージョン管理システムを開発することを決め ました。ただし、CVS の基本的な考え方は保持したまま、バグやまずい実装を 含まないようにする形で、です。

2000年の 2 月、彼らはOpen Source Development with CVS (Coriolis, 1999)の著者である Karl Fogel に連絡をとり、この新しい プロジェクトに参加する気はないかどうかたずねました。ちょうど同じころ Karl は既に新しいバージョン管理システムの設計について友人の Jim Blandy と 議論していました。1995 年に二人は CVS のサポート契約を提供する会社、 Cyclic Software を設立し、後にそのビジネスを売却しはしましたが、やはり 自分たちの日常の作業に CVS を利用していました。CVS に関する不満がもと で Jim はバージョン化されたデータの管理について、より良い方法を注意深く 考えることになり、「Subversion」 という名前だけではなく、Subversion リポジトリ の基本的な設計についても既に思いついていました。CollabNet が Karl を 呼ぶと彼はすぐにそのプロジェクトで働くことに同意し、また Jim は 雇用主である Red Hat Software が、不定期の期間にわたって彼を事実上 そのプロジェクトに無償で送り込ませることに成功しました。CollabNet は Karl と Ben Collins-Sussman を雇い、5月から詳細設計が始まりました。 CollabNet の Brian Behlendorf と Jason Robbins、そして Greg Stein (当時はWebDAV/DeltaVの仕様決めを独立した開発者として行っていました が) からのタイミングの良い刺激に助けられ、Subversion は急速に活発な 開発者コミュニティの注意を引きました。多くの人々は CVS について不満を 持っていたことがわかり、最終的に自分たちがその企画に対して何らか貢献 できることを歓迎しました。

最初の設計チームはいくつかのシンプルな目標を決めました。それはバージョン 管理手法の新しい地平を切り開くようなことを目的とはせず、単に CVS の 不具合を修正するものであるとされました。Subversion は CVS の機能に合致し、 同じ開発モデルを踏襲するが、CVS のほとんどの明らかな不具合については 繰り返さないと決められました。そしてそれは CVS を単純な置き換えである必要 はないにせよ、CVS ユーザがわずかな労力によって移行できる程度には十分 似ているべきであるとされました。

14ヶ月のコーディングの後、Subversion は 2001/8/31 に 「自分で自分自身のソースコード管理」が できるようになりました。Subversion開発者は、Subversionの自身のソースコード 管理にCVSを使うのをやめてSubversion自身を使えるようになったということです。

CollabNet がこのプロジェクトを始め、いまだに作業の大部分に出資している わけです(Subversion のフルタイム開発者の給料を払っています)が、Subverion は大部分のオープンソースプロジェクトのように実力主義を促進するような緩やかで オープンないくつかの規則によって成り立っています。CollabNet のコピーライト ライセンスは Debian Free Software Guidelines に完全に合致したものです。 言い換えると、 誰でも自由にSubversionをダウンロードし、修正し、再配布できるということです。 CollabNet や他の誰かの許可を得る必要はありません。

Subversionの機能

Subversion がバージョン管理の問題に提供しようとする機能についての議論 は CVS のデザインをどのように改良したかという観点から話しをすることが しばしば有用です。CVS になじみがないのであればこれらのすべての機能を 理解する必要はありません。そしてバージョン管理についてまったく知らない のであれば、眠くなるだけかも知れません。まず最初に第2章 基本概念を読んでください。バージョン管理システム一般 についての親切な手引きを用意してあります。

Subversion は以下の機能を提供します:

ディレクトリのバージョン化

CVS は個々のファイルの履歴を追うことができるだけですが、 Subversion は時間とともにディレクトリツリー全体の変化も追うことのできる、 「仮想的な」バージョン化ファイルシステムを実装しています。 ファイルと、さらに ディレクトリもバージョン付け します。

真のバージョン履歴機能

CVS はファイルのバージョン化に機能が制限されているので、コピー や名称変更— これはファイルだけではなくディレクトリの内容も 変更する可能性があります— は CVS ではサポートされていません。 さらに CVS では古い履歴を継承しなければ同じ名前の全く新しい ファイル— おそらく全く無関係のファイル—によってすでに バージョン化されているファイルを置き換えることはできません。 Subversion ではファイルとディレクトリの両者に対して追加、削除、 コピー、名称変更をすることができます。そして新規追加されるすべての ファイルは、そこから新しく始まるきれいな履歴を持つことになります。

不分割(Atomic)なコミット

変更点の集まりは、それ全体がリポジトリに完全に反映されるか、 まったく反映されないかのどちらかです。これにより開発者は 論理的にひとまとまりの変更を作りコミットすることができ、 一部だけがリポジトリに反映されてしまうような問題を回避する ことができます。

バージョン化されたメタデータ

ファイルとディレクトリはそれぞれ関連した属性— キーと 値の組のことです— を持つことができます。任意の キー/値の組を生成し保存することができます。属性もファイルの内容と 同じようにバージョン化されます。

ネットワーク層の選択

Subversion はリポジトリアクセス用の抽象レイアがあり、新しい ネットワークプログラムを簡単に実装できるようになっています。 Subversion は HTTP サーバの拡張モジュールとして組み込むことも できます。こうすると Subversion は信頼性や相互連携性において 非常に有利になりサーバが提供している既存の機能をすぐに利用 できるようになります—認証、認可、データ圧縮、などです。 より簡易なスタンドアロンの Subversion プロセスも利用できます。 このサーバは独自のプロトコルによって SSH を利用したトンネル 通信を簡単に実行できます。

データ処理の一貫性

Subversion は、バイナリ差分アルゴリズムを使ってファイルの差分を 表現します。これはテキスト(読むことのできるデータ)にも、バイナリ( 簡単に読むことのできないデータ)に対しても同じ方法で働きます。 どちらのタイプのデータもリポジトリ中に同じ形式で圧縮されて格納され、 差分はネットワーク上どちらの方向にも転送されます。

効率的なブランチ、タグの作成

ブランチとタグを作成するコストはプロジェクトのサイズに比例するわけでは ありません。Subversionはハードリンクとして知られている方法とよく似た方法を使って、 単にプロジェクトをコピーすることでブランチとタグを作ります。そのため ブランチ、タグの作成は非常に短い、一定の時間しかかかりません。

拡張しやすさ

Subversionは歴史的な遺物ではありません。よく設計された APIでできたCの共有ライブラリの集まりとして実装されています。 このことはSubversionの保守をとてもやりやすいものにしますし、 他のアプリケーションや 言語から利用しやすいものにします。

Subversion の構成

図 1.1. 「Subversion の構成」は Subversion の「概略」と でも呼べるようなものです。

図 1.1. Subversion の構成

Subversion の構成

一方の端はバージョン化されたすべてのデータがある Subversionリポジトリ です。もう一方はクライアントプログラムで、バージョン化されたデータの ローカルマシン上のコピー(これを「作業コピー」と言います)を 管理します。この二つの間にさまざまなリポジトリアクセス(RA)層を通じた 通信路があります。そのいくつかはコンピュータネットワークをまたいで リポジトリにアクセスするためのネットワークサーバ越しに通信します。 他のものはネットワークを利用せず直接リポジトリにアクセスします。

Subversionのインストール

Subversion はAPR (the Apache Portable Runtime library)と呼ばれる 可搬性のあるインターフェースの上に作られています。これで Subversionは Apache の httpd サーバが使えるオペレーティングシステムならどれでも 実行させることができます: Windows, Linux, すべての BSDの変種、Mac OS X, ネットウェア、その他です。

Subversion is built on a portability layer called APR—the Apache Portable Runtime library. The APR library provides all the interfaces that Subversion needs to function on different operating systems: disk access, network access, memory management, and so on. While Subversion is able to use Apache as one of its network server programs, its dependence on APR does not mean that Apache is a required component. APR is a standalone library useable by any application. It does mean, however, that like Apache, Subversion clients and servers run on any operating system that the Apache httpd server runs on: Windows, Linux, all flavors of BSD, Mac OS X, Netware, and others.

Subversionを手に入れる一番簡単な方法は自分のオペレーティング システム用のバイナリパッケージをダウンロードすることです。Subversionの ウェブサイト(http://subversion.tigris.org) には、ボランティアによって作られたダウンロード可能なパッケージが たくさんあります。このサイトには普通、Microsoft Windows のための グラフィックインストーラパッケージもあります。Unix系のオペレーティング システムを使っているなら、(RPMs, DEBs, ports tree などといった、)システム 固有のパッケージ配布システムを使うこともできます。

あるいは直接ソースコードからSubversionを作ることもできます。Subversion ウェブサイトから最新のソースコードリリースを取得してください。解凍した あとINSTALL ファイル中の説明に従って作ってください。ソースパッケージには リモートリポジトリにアクセスするためのコマンドラインクライアントを 作るのに必要なものはすべてそろっていますが、(特に apr, apr-util, そして neon ライブラリなど)、Subversionのオプション部分は Berkeley DB や、 潜在的にはApache httpd など、ほかのいろいろなソフトに依存していることに 注意してください。もし完全に ビルドしようとするなら、INSTALLファイルに書かれた すべてのパッケージが手元にあることを確認してください。既にある Subversion リポジトリの上で作業するなら、クライアントプログラムを使っ て、最新の一番新しいソースコードを取得することができます。 このやり方はソースコードの取得の項 の章に書いてあります。

Subversionの構成要素

Subversion はさまざま部品からできています。以下はその簡単な概要です。 ここでの簡単な説明で混乱してもあわてないでください; —混乱を 減らすために非常に多くのページがこの後に用意して ありますので。

svn

コマンドラインのクライアントプログラムです。

svnversion

作業コピーの(アイテムが存在するリビジョンに関係した)状態についての報告をするプログラムです。

svnlook

Subversionのリポジトリを調べるためのツールです。

svnadmin

Subversionのリポジトリを調整したり修復するためのプログラムで主 システム管理者によって使われます。

svndumpfilter

Subversion リポジトリのダンプファイル形式のデータに対 するフィルタプログラムです。

mod_dav_svn

Apache HTTP サーバ用のプラグインモジュールです。 リポジトリをネットワーク上の別のユーザが利用できるようにするものです。

svnserve

デーモンとして、またはSSHから起動されるスタンドアロンのサーバプログラムです。 ネットワーク越しにリポジトリを使えるようにする別の方法です。

Subversionが正しくインストールされていれば、これで利用できるようになって いるはずです。次の二つの章では、コマンドラインクライアントプログラム、 svnの使い方を説明します。

クイックスタート

人によってはこの本での「トップダウン」的なアプローチによって 新しい技術を習得するのが困難かも知れません。この節では Subversion の 非常に短い導入方法を用意し、「ボトムアップ」的な読者にも挑戦の機会を与える ことにします。あなたが経験によって学ぶやり方を好むようなタイプの人であ れば、以下のやり方がうまくいくでしょう。途中、この本の関連した章へのリ ンクをつけてあります。

バージョン管理モデルや CVS と Subversion の両者で利用される 「コピー・修正・マージ」モデルについて全く聞いたことがない のであればまず第2章 基本概念を読んでから先に進んだほうが よいでしょう。

注意

以下の例では Subversion のコマンドラインクライアントで あるsvn、管理用ツールである svnadminが利用可能な形で手元にあることを前提とします。 さらに Subversion 1.2 かそれ以降を利用していることも仮定します (これを確認するにはsvn --versionを実行してください)。

Subversion はすべてのバージョン化されたデータを中心的な リポジトリに格納します。最初に新しいリポジトリを作りましょう:

$ svnadmin create /path/to/repos
$ ls /path/to/repos
conf/  dav/  db/  format  hooks/  locks/  README.txt

このコマンドはSubversion リポジトリを含む新しいディレクトリ /path/to/reposを作ります。 この新しいディレクトリには(他のファイルに混じって)データベースファイルの 集まりを含んでいます。内部を詳細に知る必要がないのであれば このバージョン化されたファイルを見る必要はないでしょう。 リポジトリ生成と保守についてのより詳しい情報は 第5章 リポジトリの管理を見てください。

Subversion には「プロジェクト」という概念はありません。 リポジトリは単なる仮想的にバージョン化されたファイルシステム であり、どんなデータも含むことのできる大きなツリー構造です。 管理者によってはひとつのリポジトリにひとつのプロジェクトだけを 入れることを好みますが、他の管理者はディレクトリを分割した形で 複数のプロジェクトを格納することを好みます。両者のメリット、 デメリットについてはリポジトリレイアウトの選択の項 で議論します。どちらの方法でもリポジトリは単にファイルとディレクトリ を管理するだけなので、特定のディレクトリを「プロジェクト」 であると解釈するかどうかは人間にまかされています。それでこの本をつうじて プロジェクトを参照するときには、リポジトリに存在する、いま言ったような形 のいくつかのディレクトリ(あるいはディレクトリの集まり)についてだけ話を することに注意してください。

この例では、新しく作った Subversion リポジトリにインポートを済ませた 何かのプロジェクト(ファイルとディレクトリの集まり)があるものと 仮定しています。このデータ内容は myproject という単一のディレクトリに編成されているものとしましょう( もちろん実際には好きな名前にすることができます)。 後で説明する理由により(第4章 ブランチとマージ 参照)、ツリーの構造はbranches, tags, そして trunkという 名前の三つの最上位ディレクトリを含む必要があります。 trunkディレクトリはすべてのデータを含んでいる はずですが、branchestags ディレクトリは空です:

/tmp/myproject/branches/
/tmp/myproject/tags/
/tmp/myproject/trunk/
                     foo.c
                     bar.c
                     Makefile
                     …

branches, tags, trunkサブディレクトリは実際には Subversion に 必要なものではありません。後で利用する時におそらくもっとも便利になる ように考えられた、よく利用される命名規約にすぎません。

ツリー中にデータを作ったらsvn import コマンドでリポジトリにインポートします(svn importの項を見てください):

$ svn import /tmp/myproject file:///path/to/repos/myproject -m "initial import"
Adding         /tmp/myproject/branches
Adding         /tmp/myproject/tags
Adding         /tmp/myproject/trunk
Adding         /tmp/myproject/trunk/foo.c
Adding         /tmp/myproject/trunk/bar.c
Adding         /tmp/myproject/trunk/Makefile
…
Committed revision 1.
$ 

これでリポジトリにツリーのデータが入りました。この時点で trunkディレクトリの「作業コピー」 を作ります。ここが実際の作業を行う場所になります:

これでリポジトリにツリーのデータが入りました。 すでに注意したように、リポジトリ中のファイルやディレクトリを詳しく 調べる必要はありません; すべてはデータベース中に格納されているもの だからです。しかしリポジトリの仮想的なファイルシステムを考えると、 いまの場合、最上位にディレクトリmyprojectが あり、その下にあなたのデータが含まれている形になります。

もとの /tmp/myprojectにはなにも変更がないことに注意してく ださい。(実際、必要ならこのディレクトリを消してしまうこともできま す)。リポジトリのデータを操作するためには、このデータのために、一種の 個人用の作業領域となる新しい「作業コピー」を作らなくてはな りません。Subversion に、リポジトリのmyproject/trunkディレ クトリ用の作業コピーを「チェックアウト」するように指示して みましょう:

$ svn checkout file:///path/to/repos/myproject/trunk myproject
A  myproject/foo.c
A  myproject/bar.c
A  myproject/Makefile
…
Checked out revision 1.

これでmyprojectという名前の新しい ディレクトリ中にリポジトリのプライベートなコピーを手にしたことに なります。作業コピー中のファイルを編集し、その変更点をリポジトリに 書き戻すためにコミットすることができます。

  • 作業コピーに行ってファイル内容を修正します。

  • svn diff を実行して 変更点に対する unified diff 出力を確認します。

  • svn commit を実行して リポジトリに自分のファイルの新しいバージョンをコミットします。

  • svn update を実行して リポジトリの「最新の」状態を自分の作業コピーに反映します。

作業コピーに対してできるすべてのことについての完全な手引き については第3章 同伴ツアーを読んでください。

この時点で、ネットワーク越しに別の人々にリポジトリを 利用可能にすることもできます。 第6章 サーバの設定を読んで利用可能ないくつかのサーバプロセス の違いについて把握し、どのように設定すれば良いかを理解してください。



[2] より小さなグループ作業を狙ったCollabNet Team Edition (CTE)という 製品もあります。

第2章 基本概念

この章ではSubversionの概要を説明します。 バージョン管理システムの利用が初めての人は、必ずこの章を読んでください。 一般的なバージョン管理の概念から始めて、Subversionの背後にあるアイディア を説明し、Subversionの使い方の簡単な例をお見せします。

この章の例では複数のプログラムソースコードの共有を扱いますが、Subversion はどのようなファイルの集まりも管理できることに注意してください— コンピュータプログラマだけを助けるものではないのです。

リポジトリ

Subversion は共有情報の一元管理システムです。最も重要なのは リポジトリと呼ばれる、データの格納庫 です。リポジトリは情報をファイルシステムツリー —一般的なファイルとディレクトリの階層構造—の形で格納します。 任意の数のクライアントがリポジトリにアクセスし このようなファイルの読み書きをします。データを書き込むことでクライアントは 他の人たちがその情報を使えるようにします。データを読み出すことでクライアントは 他の人たちの情報を受け取ります。図 2.1. 「典型的なクライアント/サーバシステム」はこれ を表したものです。

図 2.1. 典型的なクライアント/サーバシステム

典型的なクライアント/サーバシステム

どうしてこんなことが興味深いのか? ここまでのところでは、典型的なファイルサーバの 定義にすぎないように思います。そして実際、リポジトリはファイルサーバの 一種です。が、普通言うようなものとは少し 違います。Subversionのリポジトリの特徴はそれまで書き込まれた すべての修正をすべて憶えているところ です。すべてのファイル変更についても、また、ディレクトリツリーの自身の変更に ついてもそうです。このような変更は、ファイルやディレクトリの追加、削除、 再配置、などによって起こります。

クライアントがリポジトリからデータを読み出すときには、普通はファイルシステム ツリーの最後のバージョンだけが見えます。が、ファイルシステムの 以前の状態も閲覧することができます。 たとえばクライアントは、 「先週の水曜日にこのディレクトリにはどのファイルがあったの?」、とか 「最後にこのファイルを変更したのは誰で、その人は何を変更したの?」 といった履歴に関する質問をすることができます。 この手の質問はすべてのバージョン管理システム のキモになるような質問です。つまりバージョン管理システムとは時間と共に 修正されるデータを記録したり、修正内容を追跡したりするようにデザイン されています。

バージョン管理モデル

バージョン管理システムの中核となる役割は共同作業での編集とデー タの共有を可能にすることです。しかしこれにはシステムごとに違った戦略が必要 になります。

ファイル共有の問題

あらゆるバージョン管理システムはどれも基本的な一つの問題を解かなくてはなりません: どうやってユーザに情報を共有させつつ、お互いの変更点が重ならないようにするか、です。 リポジトリ上の別の人の変更を間違って上書きしてしまうことは簡単に 起こりえます。

図 2.2. 「避けなくてはならない問題」に示したこんな状況を考えてみてください: 二人の同僚、Harry と Sally がいます。 二人は同時に同じリポジトリ内のファイルを編集することにしました。 もし Harry が先に彼の変更をリポジトリに書き込めば、多分、(その少し あとで) Sally は間違って彼女の新しいバージョンでそれを上書きしてしまう でしょう。Harry のバージョンは永久に失われることはありません(と、いうのは バージョン管理システムはすべての変更を記録しているため)が、 Harry がやった修正は、どれも Sally の新しいバージョンには 現れることがありません。編集時には 彼女は Harry の変更を見ることはできないからです。Harry の作業は、 実質的には失われてしまい、—あるいは少なくとも最新のバージョンからは 失われてしまい、— しかもおそらくそれは二人が意図したことではないで しょう。これこそわれわれが避けなくてはならない状況です。

図 2.2. 避けなくてはならない問題

避けなくてはならない問題

ロック・修正・ロック解除の解法

多くのバージョン管理システムでは、 ロック・修正・ロック解除のモデルを使ってこの問題 を扱います。そのようなシステムでは リポジトリ中のファイルを変更できるのは一度に一人だけです。 最初 Harry はファイルに変更を加える前に、「ロック」しなくては なりません。ファイルのロックは、図書館から本を借りるのにいろんな意味で よく似ています。もし Harry がファイルをロックすると、Sally は同じ ファイルに変更することができなくなります。ロックしようとすれば、 リポジトリはその要求を拒否します。彼女ができるのはそのファイルを 読むことと、Harryが仕事を終えてロック解除してくれるのを待つことだけ です。Harry がロックを解除したあと、彼の番は終わり、今度はSallyが ロックして編集することができる番になります。図 2.3. 「ロック・修正・ロック解除の解法」はこの単純な解法の例です。

図 2.3. ロック・修正・ロック解除の解法

ロック・修正・ロック解除の解法

ロック・修正・ロック解除のモデルの問題は、ファイル管理が少し厳しすぎる ことで、しばしば、ユーザとって作業の障害になります:

  • ロックすることは管理上の問題を起こすかも知れません。 ときどきHarryはファイルをロックしたあとでそのことを忘れてしまいます。 いっぽう Sally はずっと自分の番を待っているので、その間何もすることが できません。そしてHarryはそのままバカンスに行ってしまい、Sallyとしては 管理者に対してHarryのロックを解除してもらうように頼まなくてはならなく なります。この状況は不要な遅れと、時間の無駄を起こします。

  • ロックは不要な直列化を起こすかも知れません。 Harryはそのテキストファイルの先頭の部分を修正して、Sally は同じファイルの 最後の部分を修正したいだけだとしたら? 二人の修正はまったく重なって いません。適当な形でマージされることさえ保証できれば、二人は同じファイル を同時に編集することができ、それが大きな問題にはならないでしょう。

  • ロックは間違った意味の安心感を与えてしまう場合 があります。 HarryがファイルAをロックしてから編集し、一方Sallyは同時にファイルBを ロックしてから編集しているとします。しかしここでAとBとは意味的に 依存しあっていて、それぞれに対する独立した変更は両立しないとしましょう。 突然 A と B はもう一緒に動作しなくなります。ロックを使ったシステムは このような状況には無力です。— これはある意味で、間違った意味の 安心感を与えてしまっています。HarryやSallyが、ファイルをロックする ことでそれぞれ安全な状態に入り、自分の作業は他人から分離されていると 錯覚することは簡単に起こりえます。このことが、最初に述べたような 実は両立しない変更についての議論を妨げてしまうかも知れません。

コピー・修正・マージの解法

Subversion, CVS, その他のバージョン管理システムはロックに変わる アイディアとしてコピー・修正・マージモデルを 使います。このモデルではユーザごとのクライアントプログラムはプロジェクト リポジトリにアクセスして自分だけの作業コピーを 作ります—それはリポジトリにあるファイルやディレクトリをローカルに コピーしてきたものです。それからユーザは ひとりひとりが平行して作業をし、自分の作業コピーを修正します。 最後に自分のコピーは最終的な新しいバージョンにマージされます。 このバージョン管理システムは大部分のマージを手伝いますが 最終的には正しいマージかどうかについては人が責任を持ちます。 ユーザは平行して作業し、変更を同じファイル、ただしそれぞれの作業コピー である"A"に対して行います。

例をあげます。 Harry とSally が同じプロジェクトに対するそれぞれの作業コピーをリポジトリ の内容をコピーして作ったとします。 彼らは平行して作業し、変更をまずは自分の作業コピーの同じファイルAに対して 行います。Sally は自分の変更を先にリポジトリに保存します。 Harry が変更をあとで保存したいと思ったとき、リポジトリは、彼に対して Aは既に最新ではないことを伝えます。 言い換えると、リポジトリにあるファイルAは彼がそれをコピーした後で 別の人によって修正されていることを伝えます。そこで Harry は、Subversion のクライアントプログラムに、自分の作業コピーAに対して、リポジトリにある 新しい変更点をマージするように要求します。 Sally の変更が彼のもので上書きされることはありえません。ひとたび彼が 両方の変更を統合してしまえば、自分の作業コピーをリポジトリに書き戻す ことができます。図 2.4. 「コピー・修正・マージの解法」図 2.5. 「コピー・修正・マージの解法(続き)」 はこの処理を示しています。

図 2.4. コピー・修正・マージの解法

コピー・修正・マージの解法

図 2.5. コピー・修正・マージの解法(続き)

コピー・修正・マージの解法(続き)

しかし、Sallyの変更点がHarryのと重なって いたら? そのときはどうなるのでしょう? この状況は衝突と 呼ばれ、普通はあまり大きな問題にはなりません。 Harry がSubversionクライアントプログラムにリポジトリの最新の変更を 自分の作業コピーにマージするように要求したとき、彼のAファイルの作業 コピーは、衝突の状態としてマークされます。彼は両方の変更の衝突した 部分を見ることができ、どちらを選ぶかを選択します。ソフトウェア自体が 自動的に衝突を解決することはできないのに注意してください; 人間だけが 理解し、正しく選択する力を持っています。Harry がいったん重なっている 部分の修正を手で解消したら—たぶんSallyと衝突について話し合った あと—マージされたファイルをリポジトリに安全に書き戻すことが できます。

コピー・修正・マージのモデルは少々混沌としているように 思うかも知れませんが、実際にはとてもスムーズに行きます。 ユーザは平行して作業することができ、相手の修正を待つことはありません。 同じファイルに対して変更するときでも、ほとんどの変更は、まったく重ならない ことがわかります。そして、衝突を解消するのにかかる時間は、ロックする システムで失われる時間よりもずっと短いのです。

最終的に、これは一つの重要な要因に行き着きます: ユーザ間の コミュニケーションです。ユーザがお互いにあまり意見のやり取りをしなければ、 両方の構文上の、また意味の上の衝突は増えます。どんなシステムも ユーザに完全な意思の疎通を強制することはできないので、意味上の衝突を 検出することはできません。そういうわけで、ロックするシステムが衝突を 回避することができるという間違った保証に安心する理由はありません。 実際には、ロックは生産性を落とす以外のなにものでもないように見えます。

実行中のSubversion

そろそろ抽象論から具体的な議論に移るときがきました。この章で はSubversion が利用される実際の例をお見せします。

作業コピー

既に作業コピーについて読んできたことと思いますので、Subversionのクライアント プログラムが作業コピーを作ったり使ったりする様子を見てみます。

Subversion 作業コピーは、自分のローカルシステム上の普通の ディレクトリツリーで、その中には複数のファイルがあります。あなたは 望むファイルを編集することができ、ソースコードファイルなら、それを 普通にコンパイルすることができます。作業コピーは自分だけの作業領域 です: Subversion はほかの人の変更を持ち込んだりしませんし、明示的に そうしてくれと言うまで、自分の変更を他の人に見せたりすることも ありません。同じプロジェクト用に一人で複数の作業コピーを持つことさえできます。

作業コピーのファイルに変更を加え、それがうまく動作することを 確認したあとで、Subversion はその変更を同じプロジェクトであなたと一緒に 作業しているほかの人に「公開」するためのコマンドを(リポジトリに 書き込むことで)用意します。もし他の人が自分自身の変更を公開したとき にはSubversionはその変更を自分の作業コピーにマージするコマンドを用意します。 (リポジトリの内容を読み出すことで。)

作業コピーには、Subversionによって管理される、いくつかの特殊な ファイルもあり、その助けによって(読み出し、書き込みなどの)コマンドを 実行します。特に作業コピー中のディレクトリには.svn という名前の、管理ディレクトリとして知られる サブディレクトリがあります。管理ディレクトリのそれぞれのファイルは Subversionがどのファイルにまだ公開していない変更があるか、どのファイルが 他の人の作業によって最新でなくなっているか理解するのを助けるものです。

典型的な Subversion リポジトリは複数のプロジェクトのファイル (またはソースコード)をつかんでいます。普通、それぞれのプロジェクトは リポジトリのファイルシステムツリー中のサブディレクトリになっています。 この構成によって、ユーザの作業コピーは普通、リポジトリの特定の 部分木に対応しています。

たとえば二つのソフトウェアプロジェクト、paintcalcを含むリポジトリが あるとします。それぞれのプロジェクトはそれぞれの最上位サブディレクトリ にあります。図 2.6. 「リポジトリのファイルシステム」のような状況です。

図 2.6. リポジトリのファイルシステム

リポジトリのファイルシステム

作業コピーを持ってくるため、リポジトリ中のどれかのサブツリーを チェックアウトしなくてはなりません。 (「check out」 という言葉は何かをロックしたり保護したり するような響きがありますがそうではありません; それは単に自分のための プロジェクトのコピーを作るだけです。) たとえば/calcをチェックアウトするとこんな 感じで作業コピーを手に入れることができます:

$ svn checkout http://svn.example.com/repos/calc
A    calc/Makefile
A    calc/integer.c
A    calc/button.c
Checked out revision 56.

$ ls -A calc
Makefile  integer.c  button.c  .svn/

Aの文字で始まる一覧はSubversionがあなたの作業コピーにいくつかの ファイルを追加したことを示しています。これでリポジトリにある /calcディレクトリの作業コピーを 持ってくることができました。最初に言ったように、この取得時に は、もう一つ、.svnが 作成されますが、これがSubversionに必要な追加情報を格納する ための場所になります。

button.cに変更を加えることを考えてみます。 .svnディレクトリがファイルの修正時刻と もともとの内容を記憶しているので、Subversionはあなたがファイルを 変更したかどうかを見分けることができます。しかしSubversionは明示的に そうしてくれと言われるまでその変更を公にはしません。 自分の変更を公開する操作のことを変更点のコミット (あるいは チェックイン)と言います。

変更点を他の人に公開するにはSubversionのcommit コマンドを使います:

$ svn commit button.c
Sending        button.c
Transmitting file data .
Committed revision 57.

これでbutton.cへの変更はリポジトリに コミットされました。もし別のユーザが/calc の作業コピーを作るのにチェックアウトすれば、最新バージョン中に あなたの変更点を見ることになるでしょう。

一緒に作業している Sally が、あなたがチェックアウトしたのと同じ時刻に /calc の作業コピーを自分用にチェックアウト したとしましょう。あなたがbutton.cへの自分の 変更をコミットしても、Sallyの作業コピーは変更されない状態のままです。 Subversionはユーザの要求によって初めて作業コピーの内容を変更します。

作業内容をプロジェクトの最新の状態にするには、SallyはSubversionに 自分の作業コピーを更新 するように依頼しなくては なりません。これにはupdate コマンドを使います。 これはあなたの変更を彼女の作業コピーにマージしますし、彼女がチェック アウトしたあとで他の人がコミットしたすべての部分についてもマージします。

$ pwd
/home/sally/calc

$ ls -A 
.svn/ Makefile integer.c button.c

$ svn update
U    button.c
Updated to revision 57.

svn updateコマンドからの出力は Subversionがbutton.cの内容を 更新したことを示しています。Sally はどのファイルを更新 するかを指定する必要がないのに注意してください。Subversion は .svnディレクトリの情報と リポジトリの情報を使って、どのファイルを更新しなくてはならないか を決定します。

リビジョン

svn commit操作は一つのトランザクション として任意の数のファイル、ディレクトリに対する変更点を公開する ことができます。作業コピー中で、ファイルの内容を変えたり、新しい ファイルを作ったり、削除したり、名前を変えたり、ファイルや ディレクトリをコピーしたあと、それらの変更点の全体を完全なひと かたまりのものとしてコミットすることができます。

リポジトリでは、それぞれのコミットは、一つの分割できないひと かたまりのトランザクションとして扱います。すべてのコミットに よる変更は、完全に実行されるか、まったく実行されないかの どちらかです。Subversionは、この不分割の性質を、プログラム 障害、システム障害、ネットワーク障害、その他の操作があった 場合でも保とうとします。

リポジトリがコミットを受け付けるときは常に リビジョンと呼ばれるファイルシステム ツリーの新しい状態を作ります。それぞれのリビジョンには 一意な自然数が割り当てられます。前のバージョンよりも 後のバージョンのほうが数が大きくなります。 リポジトリ新規作成時の最初のバージョンはゼロで、ルートディレクトリ 以外には何も含まれていません。

図 2.7. 「リポジトリ」はリポジトリを視覚化するうまい方法 を示しています。0から始まるリビジョン番号が、左から右に追加されていく 状況を想像してください。それぞれのリビジョン番号には対応した ファイルシステム木があり、それぞれの木はコミット 後のリポジトリの状態を示す「スナップショット」 です。

図 2.7. リポジトリ

リポジトリ

作業コピーは常にリポジトリのどれか一つのリビジョン対応しているとは 限らないことに注意してください。複数の異なるリビジョンのファイル を含んでいるかも知れません。たとえば、最新リビジョン番号が4である リポジトリから作業コピーをチェックアウトしたとします:

calc/Makefile:4
     integer.c:4
     button.c:4

この時点では、作業コピーはリポジトリのリビジョン4と完全に一致しています。 しかし、ここで button.cに変更を加え その変更をコミットしたとします。他にコミットした人がいない場合、 今回のコミットはリポジトリのバージョンを5にあげ、作業コピーの内容は 以下のようになります:

calc/Makefile:4
     integer.c:4
     button.c:5

この時点でSallyがinteger.cに対する修正を コミットし、リビジョンを6にあげたとします。ここでもし、svn update コマンドであなたの作業コピーを更新すると、次のようになるでしょう:

calc/Makefile:6
     integer.c:6
     button.c:6

Sallyのinteger.cへの変更は あなたの作業コピーに現れますが、button.c に対するあなたの変更はそのままです。この例では、 Makefileのテキストは、リビジョン4,5,6で まったく同一のものですが、Subversionはあなたの作業コピー中の Makefileのリビジョンを6として、 それが最新であることを表現します。それで自分の作業コピーに きれいなアップデートをかけたときには、一般に作業コピーは リポジトリのある特定のバージョンと完全に一致します。

作業コピーはどのようにリポジトリを追いかけるか

作業コピー中のそれぞれのファイルについて、Subversionは 二つの本質的な情報を.svn/管理領域に 記録します:

  • あなたの作業ファイルは、どのリビジョンに基づいているか (これはファイルの作業リビジョンと呼ばれます)、 そして

  • リポジトリとの対話によって作業コピーが最後に更新された時刻

これらの情報とリポジトリとの対話によって、Subversionは作業ファイルの それぞれが、以下の四つの状態のどれにあるかを見分けることができます:

変更なし、かつ最新

作業コピーのファイルは変更されていないし、その作業リビジョン 以降に起きたリポジトリに対するコミットでもそのファイルに対する変更が ない状態。 そのファイルに対するsvn commitは何も実行しませんし、 svn updateも何もしません。

ローカルで変更あり、かつ最新

作業コピー中のファイルは変更されましたが、そのベースリビジョン以降の リポジトリへのコミットで、そのファイルに対する変更が何もなかった 場合。作業コピーにはまだリポジトリにコミットしていない変更がある ので、そのファイルに対するsvn commitは、 あなたの変更点をそのまま公開することで成功します。svn update は何も実行しません。

変更なし、かつ、最新ではない

ファイルは作業コピー中では変更されていませんが、リポジトリには 変更がありました。このファイルは、公開リビジョンによって最新とするために どこかで更新する必要があります。そのファイルに対するsvn commit コマンドは何もしません。そのファイルに対するsvn updateは あなたの作業コピーに最新の修正点をマージします。

ローカルで変更あり、かつ最新ではない

ファイルは作業コピーでも、リポジトリでも変更されています。 ファイルに対するsvn commitは「out-of-date」 エラーになります。そのファイルはまず更新しなくてはなりません。 ファイルに対するsvn updateは公開されている変更点 を作業コピーの変更にマージしようとします。これが自動的にできないような 状況の場合、Subversionはユーザに衝突の解消をさせるためそのままにして おきます。

これにはいろいろな情報の変化を追う必要があるように思いますが、 svn status コマンドを使えば、あなたの作業コピーの どのファイルの状態も表示できます。このコマンドについてのより詳しい情報は svn statusの項 を見てください。

混合リビジョン状態の作業コピー

原則として、Subversionはできる限り柔軟であろうとします。 この特別な例として、作業コピーに、いろいろな異なる作業リビジョン番号を もったファイルとディレクトリを共存させることが できます。前の例での混合リビジョンに戸惑っている人のために、 なぜこのような機能が必要で、どのように利用したらよいかを以下に示します。

更新とコミットは別の処理です

Subversion での基本的な原則の一つは、「作業コピーへの取得(push)」の動作 が「リポジトリへの反映(pull)」動作を自動的に引き起こすことは ないし、逆もないということです。これは、あなたがリポジトリへの新しい変更点を 送信する用意ができているということが、他の人たちの変更点を受け取る用意が できていることを意味していることはないという、当たり前の理由によります。 そして自分がまだ引き続き新しい修正を加えている場合、 svn update は自分自身の作業コピー中にリポジトリの内容をうまく反映してくれるはずで、 このさい、あなたの側の変更点を強制的に他の人々に公開する必要はありません。

この規則はまた副次的に、作業コピーには混合リビジョンの状態を記録する ための特殊な仕組みが必要になり、またその状態に対して寛容でなければならない ことを意味しています。これはディレクトリ自身もバージョン管理できる ためさらに複雑な話になります。

たとえば、作業コピーが完全にリビジョン 10 にあるとします。foo.html を編集してsvn commitを実行した結果、リポジトリにリビジョン 15 ができたとします。このコミットが成功した直後では、多くの不慣れなユーザは 作業コピーは完全にリビジョン 15 にあるだろうと期待するかも知れませんがそうでは ないのです!。リビジョン10 とりビジョン15 までの間にリポジトリに対していろいろな変更が 起こったかも知れないのです。クライアント側ではリポジトリに起きたこの変更については 何も知りません。まだ svn update を実行していませんし、 svn commit は新しい変更点をリポジトリから取得したりはしないからです。 一方、もしかりにsvn commitが自動的に最新の変更点をダウンロード するとすれば、作業コピー全体を完全にリビジョン 15 に設定することも可能 でしょう—しかしこれでは「push」と「pull」 が独立した処理であるという基本的な原則を侵すことになります。 このため Subversion クライアントができる唯一の安全な方法は、ある特定の ファイル—foo.html—がリビジョン 15 にある という印をつけることだけです。作業コピーの残りのファイルはリビジョン 10 の ままなのです。svn updateを実行することだけが、最新の変更点 をダウンロードする方法であり、これで作業コピー全体にリビジョン 15 の印がつきます。

混合リビジョンは正常な状態です

事実として、svn commitを実行するときは 常に、あなたの作業コピーはあるいくつかのリビジョンの 混合状態となります。コミット対象となったファイルだけは、それ以外のファイル よりも新しい作業リビジョンになります。何度かのコミットの後で( その間に update を含めなければ)、作業コピーはいくつかのリビジョンの 混合状態になります。あなたがリポジトリを利用している唯一のユーザであったと してもやはりこの現象に出会うでしょう。作業リビジョンの混合状況を見る にはsvn status --verboseコマンドを利用して ください(さらに詳しい情報については svn statusの項を見てください)。

不慣れなユーザは自分の作業コピーが混合リビジョンになっていることには まったく気づかないことがよくあります。多くのクライアントコマンドは 処理対象となるアイテムの作業コピー上でのリビジョンが問題になるので 混乱することになります。例えばsvn logコマンドは ファイルあるいはディレクトリの変更履歴を表示するために利用されます (svn logの項参照)。ユーザがこのコマンド を作業コピー上野オブジェクトに対して実行するとき、そのオブジェクト の完全な履歴を見れるものだと考えるでしょう。しかしそのオブジェクトの 作業コピー上のりビジョンが非常に古いものであった場合(これは svn updateが長い期間にわたって実行されなかったような 場合におこります)、そのオブジェクトの より古い バージョン履歴が表示されるでしょう。

混合リビジョンは役にたつものです

プロジェクトが非常に複雑になった場合、作業コピー中の一部のファイル を強制的に「古い日付」をもった以前のリビジョンに戻すことが 有用であることに気づくでしょう; どうやるかについては 3 章で説明します。 たぶん、あるサブディレクトリにあるサブモジュールの以前のバージョンを テストしたいか、特定のファイルに存在するバグが最初に紛れ込んだ リビジョンを知りたいとかいった場合でしょう。これはバージョン管理 システムの 「タイムマシン」としての性質の一つです— つまり、作業コピーの任意の部分を履歴の中のより新しい状態や古い状態に 移動することができるのです。

混合リビジョンには制約があります

作業コピー中を混合リビジョン状態に置くことはできますが、 この柔軟性には制約があります。

まず、完全に最新状態ではないファイルやディレクトリの削除を コミットすることができません。より新しいバージョンのアイテムが リポジトリに存在する場合、この試みは拒否されます。まだあなたが 見ていない変更点を間違って消してしまうことを防ぐためです。

次に、完全に最新状態ではないディレクトリに対するメタデータの変更 はコミットできません。アイテムに対する 「属性」の 付与は 6 章で扱います。ディレクトリの作業リビジョンは特定の エントリと属性の組を定義し、最新のディレクトリへの属性の 変更点のコミットは、やはりまだ見ていない変更点を間違って消して しまうかも知れないからです。

まとめ

この章では、さまざまなSubversionの基本的な概念を扱いました:

  • 中心となるリポジトリ、クライアント作業コピー、リポジトリリビジョンツリーの 並び、といった概念を導入しました。

  • どのように二人の共同作業者がSubversionを利用してお互いの修正点を公開したり 受け取ったりするかの簡単な例を見てきました。これには、「コピー・修正・マージ」 のモデルを利用するのでした。

  • Subversionが作業コピー内の情報をたどったり管理したりする方法について 少し触れました。

ここでは、最も一般的な意味で、Subversionがどのように動作するかについての 良い考え方が身に着いたはずです。この知識をもとに、次の章に進むことが できます。ここは、Subversionのコマンドと機能についての詳しいツアーに なっています。

第3章 同伴ツアー

さて、Subversionを使った詳細を見ていくことにしましょう。この章を 終えるころには、Subversionを使った日常的にしなくてはならない操作のほとんど すべてをやることができるようになっているでしょう。 ソースコードの最初のチェックアウトから始まって、修正し、その修正内容を 調べます。他の人の修正をどうやって自分の作業コピーにマージし、それが どのようなものかを調べ、起きるかも知れない衝突をどのように扱えば 良いかもわかるでしょう。

この章は、Subversionコマンドの全体を列挙するのではないのに注意してください。 —そうではなく、普段一番よく利用するSubversionの操作についての対話的な手引き にしてあります。この章は、 第2章 基本概念 を読み、理解していることと、Subversionの一般的モデルをよく知っていることを前提 としています。コマンドの完全なリファレンスは、 第9章 Subversion リファレンス を見てください。

おたすけを!

読み進める前に、Subversionを使うときに必要な一番重要なコマンドを載せて おきます: svn help Subversionコマンドラインクライアントは、自分自身の中にドキュメントを 持っています。—いつでも svn help <サブコマンド>とやれば 構文、オプションスイッチ、その サブコマンドの振る舞いを見ることができます。

インポート

svn importで、Subversionのリポジトリに新しいプロジェクトを インポートできます。Subversionサーバを設定するときには、一番最初に 実行するコマンドかも知れま