Subversionは、ファイルやフォルダまたはディレクトリに対する変更を追跡するバージョン・コントロール・システムで、データ・リカバリを容易にし、経時的な変更の履歴を提供します。この章では、バージョン・コントロールのためのSubversionのインストールおよび構成方法について説明します。
この章の構成は、次のとおりです。
SubversionはApacheプロジェクトですが、Apacheではオペレーティング・システム用の独自のバイナリ・ファイルをビルドしていません。次のURLに、サード・パーティによってビルドされた全主要オペレーティング・システム用のSubversion最新安定リリースに関するURLが示されています。
http://subversion.apache.org/packages.html
可能な場合には、YUMやAPTなどのパッケージ・マネージャを使用して、他のソフトウェアのインストールを管理してください。
Windowsオペレーティング・システムの場合は、次のURLで入手可能なSilk SVNなどのプリコンパイル済バイナリ・パッケージを使用することをお薦めします。
http://www.silksvn.com/en/download
Windowsで、インストーラ・パッケージを使用してSubversionをインストールする場合は、サーバー・バイナリ・ファイルを含むインストーラを選択するようにしてください。
インストール方法は、プラットフォームおよび配布方法によって異なります。
たとえば、YUMを使用する場合、コマンドは次のようになります。
sudo yum install subversion
Windowsの場合、デフォルトのインストール・パスをより短い場所に変更できます。
C:\svn
PATH変数がインストーラによって正しく設定されていることを確認します。
svnserveのバージョン情報を取得するには、コマンドラインで次のコマンドを実行します。
svnserve --version
コマンドが見つからない場合は、次の手順を実行します。
「コントロール パネル」を開きます。
「システム」→「システムの詳細設定」の順に選択します。
「詳細設定」で、「環境変数」を選択します。
Subversionバイナリ・ディレクトリへのパスを追加して、「システム環境変数」ペインのPATH変数を編集します。
Subversionサーバーをサービスとして構成するには、次の手順を実行します。
Linuxの場合
Linuxインストール・プロセスによって、自動的に/etc/init.d/svnserveスクリプトが作成されます。このスクリプトにより、システムの起動時にサーバーが起動します。
サービスを手動で開始するには、コマンドラインで次のコマンドを実行します。
sudo /etc/init.d/svnserve start
Windowsの場合
サービス・マネージャにsvnserveを登録する必要があります。svnserveを登録するには、次のコマンドを実行します。
sc create svnserver binpath= "C:\svn\svnserve.exe" --service -r "REPOS_PATH" displayname="Subversion" depend=Tcpip start=auto
前述のコマンドで、REPOS_PATHはローカル・ファイル・システムへの絶対パスです。
Subversionリポジトリは、バージョン作成されている、Subversionサーバー上のアーティファクトの集まりです。
この章の内容は次のとおりです。
Subversionのインストール後、リポジトリを作成する必要があります。svnadminという名前のコマンドライン・ユーティリティは、サーバー側の管理操作の主要ツールです。
Linuxの場合
リポジトリを生成するには:
次のコマンドを実行して、リポジトリ用のディレクトリを作成します。
mkdir -p REPOS_PATH
このコマンドのREPOS_PATHは、ローカル・ファイル・システムへの絶対パスです。
次に例を示します。
mkdir –p /ciroot/subversion/repository
次のコマンドを実行して、指定パスにリポジトリを作成します。
svnadmin create REPOS_PATH
このコマンドのREPOS_PATHは、ローカル・ファイル・システムへの絶対パスです。
次に例を示します。
svnadmin create /ciroot/subversion/repository
Windowsの場合
リポジトリを生成するには:
次のコマンドを実行して、リポジトリ用のディレクトリを作成します。
mkdir REPOS_PATH
このコマンドのREPOS_PATHは、ローカル・ファイル・システムへの絶対パスです。
次に例を示します。
mkdir C:\ciroot\subversion\repository
次のコマンドを実行して、指定パスにリポジトリを作成します。
svnadmin create REPOS_PATH
このコマンドのREPOS_PATHは、ローカル・ファイル・システムへの絶対パスです。
次に例を示します。
svnadmin create C:\ciroot\subversion\repository
リポジトリへのアクセスは、ファイル許可と、SVNクライアントを介してリポジトリにアクセスするために参照されるユーザーよって制御されます。新規リポジトリ内のすべてのファイルについて、ユーザーおよびグループ許可が、リポジトリの内容に対するアクセス制御のタイプを反映していることを確認します。
デフォルトでは、新規リポジトリに対して匿名の読取り専用アクセスが有効になります。つまり、SSHアクセスを持つどのユーザーでも、リポジトリの許可設定に関係なく、リポジトリ・ファイルをチェックアウトできることになります。これは、REPOS_PATH/conf/svnserve.confファイルで変更できます。
これでリポジトリの作成が完了し、次の基本URLを使用することで、新規リポジトリに対する標準操作をSubversionクライアントで実行できます。
svn+ssh://USER@HOST/REPOS_PATH
次に例を示します。
svn ls svn+ssh://mycompany@localhost/ciroot/subversion/repository
svn+ssh以外にも、Subversionによってサポートされている他のプロトコルが複数あります。他のプロトコルを構成する方法については、Subversionのマニュアルを参照してください。デフォルトでは、Windowsでsvn+sshは使用できないことがあります。
Subversionではリポジトリ内に特定のサブディレクトリ構造は必要ありませんが、このマニュアルで行われているように、規定の表記規則に従うことをお薦めします。一般的なリポジトリ・レイアウトは次のようになります。

主要なコード行の開発はtrunkディレクトリで行われます。リリースが実行されると、現在のトランク・ソースが、tagsディレクトリの、そのリリースに対応するタグにコピーされます。Subversionのコピー操作は、サーバーが内部的に変更を追跡するため、記憶域の点で高価ではありません。
次にタグの例を示します。
my-project/tags/3.0.5
前述の例の場合、3.0.5は、このタグが対応しているリリース・バージョンを示します。
タグは、パッチ作成またはバグ修正のリリースに必要になる可能性のある、将来的な作業に重要です。リリース・タグのもう1つの重要な点は、関連リリースの問題に関する調査が容易になることです。
タグのパッチやそれに続く変更が必要とみなされた場合は、分岐の作成が必要になります。分岐はリポジトリ内の他の場所のコピーで、タグとは構成が異なります。タグのコピーをbranchesディレクトリに作成した後、コードをチェックアウトしたり、必要に応じて変更することができます。変更が完了すると、新しいリリースが分岐から作成され、対応するタグが作成されます。
このProject-Aの例は、ソース・コードのパッチ管理に関する一般的なワークフローの概要を示しています。
Project-Aの場合、主要なコード行はproject-A/trunkで管理されます。trunkディレクトリで現在開発されているバージョンは、バージョン2.1です。Project-Aには前のリリースが3つあり、1.0、1.1および2.0です。バージョン1.0でパッチ・リリースを必要とする問題が検出されています。
この問題に対応するために、svn copyコマンドを使用して、project-A/branches/1.0.1-SNAPSHOTにproject-A/tags/1.0タグがコピーされています。次の図に示すように、SNAPSHOT指定はまだリリースされていないバージョンを示すMavenの仕組みです。
分岐のコード修正が完了すると、その分岐はproject-A/branches/1.0.1-SNAPSHOTからproject-A/tags/1.0.1タグにコピーされます。その後、このタグからリリース・ビルドを実行できます。

ディレクトリ構造の表記規則の詳細は、次のURLにある『Subversionによるバージョン管理』の第2章を参照してください。
リポジトリ内に管理の必要な既存プロジェクトがある場合、SVNクライアントのimportコマンドを使用して、これらをインポートできます。
svn import LOCAL_PATH REPOSITORY_URL/REPOSITORY_PATH
次に例を示します。
svn import /checkouts/project-a svn+ssh://user@svn.mycompany.com/ciroot/subversion/repository/project-a/trunk/ -m "initial import"
コードを変更するには、通常、次の操作を実行します。
svn updateコマンドを使用して作業コピーを更新します。
変更を行います。必要に応じて、svn add、svn delete、svn copyおよびsvn moveコマンドを使用し、ファイルを編集します。
svn statusおよびsvn diffコマンドを使用して、変更を確認します。
間違いを修正します。svn revertコマンドを使用すると、変更を取り消したり、中止することができます。
競合を解決します。競合が解決したら、svn resolveコマンドを使用してマークを付けます。
svn commitまたはsvn ciコマンドを使用して、変更をコミットします。
図3-1は、SVN操作の完全なライフサイクルを示しています。
継続的インテグレーションの開発プロセスでは、このワークフローはおおむね変わりません。非継続的インテグレーション・プロセスよりも、コミットされる変更のセットが小さく、より頻繁に発生する傾向があります。継続的インテグレーション・システムでインテグレーション・ビルドを実行できるように、ターゲット・リリース用のアクティブなトランクまたは分岐コードをコミットする必要があります。将来的にメインライン・コード・ベースにマージすることを意図した個人的な分岐の作成は避けてください。個人的な分岐およびマージの手法は統合を遅らせるもので、継続的インテグレーションの原則に反します。
Subversionで管理されたプロジェクトの作業を開始するには、最初にファイルをローカル・ファイル・システムにチェックアウトする必要があります。SVNクライアントによって、各サブディレクトの.svnディレクトリにあるSubversionメタデータなどのプロジェクト・ファイルがシステムにコピーされます。次のコマンドを実行して、ファイルをチェックアウトします。
svn co REPOSITORY_URL/REPOSITORY_PATH LOCAL_DIRECTORY
このコマンドの内容は次のとおりです。
REPOSITORY_URLは、SubversionリポジトリへのURLです。
REPOSITORY_PATHは、チェックアウトされるディレクトリへのパスです。
LOCAL_DIRECTORYは、チェックアウトされたプロジェクトが格納されるローカル・ディレクトリへのパスです。
test-projectの例は、プロジェクトのメインライン・コード開発を示しています。
svn checkout svn+ssh://user@svn.mycompany.com/subversion/repository/test-project/trunk test-project
この場合、test-projectというディレクトリが作成され、プロジェクトの内容は再帰的にサーバーからディレクトリにコピーされます。
チェックアウトされたファイルに対していくつでも変更を行うことができます。リポジトリに変更をコミットする準備が整ったら、コミットするファイルまたはディレクトリをチェックインします。すべてのコンポーネントがチェックアウトされるディレクトリのメンバーであるかぎり、チェックインされるファイルまたはディレクトリのセットが、チェックアウトされたファイルまたはディレクトリのセットに対応している必要はありません。次のコマンドを実行して変更をコミットします。
svn commit -m "Added code and test case" test-project/src/main/java test-project/src/test/resources/testdata.xml
チェックアウトまたは最後の更新とコミットの間に変更が行われた場合、操作は失敗し、理由を説明するメッセージが表示されます。競合を解決し、競合が解決済としてマークされるようにシステムを更新する必要があります。これを行うには、競合を解決して、次のコマンドを実行します。
svn resolve test-project/src/test/resources/testdata.xml
競合を解決した後、通常のチェックイン操作を続行します。
プロジェクトがいったんシステムにチェックアウトされた後は、そのソース・コードに対する後続のチェックアウトを実行する必要がなくなります。Subversionリポジトリの内容との同期を維持するために、チェックアウトされたディレクトリ、さらには個々のファイルに対してsvn updateを実行できます。
リポジトリにローカル変更をコミットする操作の前に、svn updateコマンドを実行して、最後のチェックアウトまたは更新以降に、他のユーザーによってコードにコミットされた変更を統合します。
svn update
最後に、次のコマンドを実行して変更をコミットします。
svn commit -m "description of the updates"
タグ付けによって分岐の名前付きポイント・イン・タイム・コピーが作成されます。タグ付けは次の2つの場合に必ず実行する必要があります。
プロジェクトがリリースされた場合
重要なマイル・ストーンが発生した場合
リリースにタグを付けることが重要ですが、これは、タグによってパッチ適用リリースのための簡単なメカニズムが提供されるためです。あるリリースに不具合が見つかった場合、そのリリースのタグから分岐して、修正を行い、そのリリースのパッチを作成できます。後でこの新しい(パッチ適用済の)リリースに問題が見つかり、新しい問題に対する修正が必要になった場合には、このリリースにも同様にタグを付けます。
リリースにタグを付けなかった場合、そのリリースにビルドされている正確なコード行の取得が非常に難しくなります。
|
注意: タグ付きリリースは読取り専用アーティファクトとして取り扱います。タグを付けた後にリリースに対するマージを続行しないようにしてください。 |
この項では、2つの一般的なSubversionクライアントについて説明します。
WebSVNは、リポジトリに対するWebベースのビューを提供し、視覚的な差分、注釈および検索をサポートします。
WebSVNは次の場所からダウンロードできます。
TortoiseSVNは、Windowsエクスプローラと統合されるフリーのWindows Subversionクライアントです。標準的なSubversionクライアントのすべての操作をWindowsユーザー・インタフェースで実行できます。フォルダおよびファイル・アイコンのデコレータは、Subversionファイルのステータスを示します。コマンドライン・ツールはメニュー項目にマップされ、オプションはダイアログ・ボックスを介して構成可能です。また、Tortoiseでは高度でグラフィカルな差分と、競合の解決に役立つマージ・ツールも提供しています。
TortoiseSVNは次の場所からダウンロードできます。
このマニュアルは、Subversionを開始および実行するための簡易ガイドとして作成されています。詳細は、次の場所にある『Subversionによるバージョン管理』を参照してください。