3 バージョン・コントロールのためのSubversionのインストールおよび構成

Subversionは、ファイルやフォルダまたはディレクトリに対する変更を追跡するバージョン・コントロール・システムで、データ・リカバリを容易にし、経時的な変更の履歴を提供します。

この章では、バージョン・コントロールのためのSubversionのインストールおよび構成方法について説明します。

トピック:

Subversionのダウンロード

SubversionはApacheプロジェクトですが、Apacheではオペレーティング・システム用の独自のバイナリ・ファイルをビルドしていません。サード・パーティが、すべての主要オペレーティング・システム用のバイナリ・ファイルをビルドします。

次のURLに、サード・パーティによってビルドされた全主要オペレーティング・システム用のSubversion最新安定リリースへのリンクが示されています。

http://subversion.apache.org/packages.html

可能な場合には、YUMやAPTなどのパッケージ・マネージャを使用して、他のソフトウェアのインストールを管理してください。

Windowsの場合は、次のURLで入手可能なSilk SVNなどのプリコンパイル済バイナリ・パッケージを使用することをお薦めします。

http://www.silksvn.com

Windowsで、インストーラ・パッケージを使用してSubversionをインストールする場合は、サーバー・バイナリ・ファイルを含むインストーラを選択するようにしてください。

Subversionのインストール

Subversionは、主なプラットフォームのどれにでもインストールできます。

インストール方法は、プラットフォームおよび配布方法によって異なります。

たとえば、YUMを使用する場合、コマンドは次のようになります。

sudo yum install subversion

Windowsの場合、デフォルトのインストール・パスをより短い場所に変更できます。

C:\svn

PATH変数がインストーラによって正しく設定されていることを確認します。

svnserveのバージョン情報を取得するには、次のコマンドを実行します。

svnserve --version

コマンドが見つからない場合は、次の手順を実行します。

  1. 「コントロール パネル」を開きます。
  2. 「システム」「システムの詳細設定」の順に選択します。
  3. 「詳細設定」で、「環境変数」を選択します。
  4. Subversionバイナリ・ディレクトリへのパスを追加して、「システム環境変数」ペインのPATH変数を編集します。

サービスとしてのSubversionサーバーの構成

必要なときにSubversionが実行されるように、サービスとして構成します。

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という名前のコマンドライン・ユーティリティは、サーバー側の管理操作の主要ツールです。

リポジトリを生成するには:

  1. 次のコマンドを使用して、リポジトリ用のディレクトリを作成します。
    (Linux) mkdir -p REPOS_PATH
    (Windows) mkdir REPOS_PATH
    

    このコマンドのREPOS_PATHは、ローカル・ファイル・システムへの絶対パスです。

    たとえば:

    (Linux) mkdir –p /ciroot/subversion/repository
    (Windows) mkdir C:\ciroot\subversion\repository
    
  2. 次のコマンドを使用して、指定パスにリポジトリを作成します。
    svnadmin create REPOS_PATH
    

    このコマンドのREPOS_PATHは、ローカル・ファイル・システムへの絶対パスです。

    たとえば:

    (Linux) svnadmin create /ciroot/subversion/repository
    (Windows) 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レイアウトの使用

Subversionではリポジトリ内に特定のサブディレクトリ構造は必要ありませんが、このマニュアルで行われているように、規定の表記規則に従うことをお薦めします。

一般的なリポジトリ・レイアウトは次のようになります。

主要なコード行の開発はtrunkディレクトリで行われます。リリースが実行されると、現在のトランク・ソースが、tagsディレクトリの、そのリリースに対応するタグにコピーされます。Subversionのコピー操作は、サーバーが内部的に変更を追跡するため、記憶域の点で高価ではありません。

次にタグの例を示します。

my-project/tags/3.0.5

前述の例の場合、3.0.5は、このタグが対応しているリリース・バージョンを示します。

タグは、パッチ作成またはバグ修正のリリースに必要になる可能性のある、将来的な作業に重要です。リリース・タグのもう1つの重要な点は、関連リリースの問題に関する調査が容易になることです。

タグのパッチやそれに続く変更が必要とみなされた場合は、分岐の作成が必要になります。分岐はリポジトリ内の他の場所のコピーで、タグとは構成が異なります。タグのコピーをbranchesディレクトリに作成した後、コードをチェックアウトしたり、必要に応じて変更することができます。変更が完了すると、新しいリリースが分岐から作成され、対応するタグが作成されます。

次のProject-Aの例は、ソース・コードのパッチ管理に関する一般的なワークフローの概要を示しています。

  1. Project-Aの場合、主要なコード行はproject-A/trunkで管理されます。trunkディレクトリで現在開発されているバージョンは、バージョン2.1です。Project-Aには前のリリースが3つあり、1.0、1.1および2.0です。

  2. バージョン1.0でパッチ・リリースを必要とする問題が検出されています。

  3. この問題に対応するために、svn copyコマンドを使用して、project-A/branches/1.0.1-SNAPSHOTproject-A/tags/1.0タグがコピーされています。次の図に示すように、SNAPSHOT指定はまだリリースされていないバージョンを示すMavenの仕組みです。

  4. 分岐のコード修正が完了すると、その分岐はproject-A/branches/1.0.1-SNAPSHOTからproject-A/tags/1.0.1タグにコピーされます。その後、このタグからリリース・ビルドを実行できます。

ディレクトリ構造表記規則の詳細は、次の場所にあるSubversionを使用したバージョン・コントロールで推奨されているリポジトリ・レイアウトに関する項を参照してください。

http://svnbook.red-bean.com/

既存プロジェクトのインポート

リポジトリ内に管理の必要な既存プロジェクトがある場合、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ワークフローの理解

SVNで作業を開始する前に、典型的なワークフローを理解する必要があります。

コードを変更するには、通常、次の操作を実行します。

  1. svn updateコマンドを使用して作業コピーを更新します。

  2. 変更を行います。必要に応じて、svn addsvn deletesvn copyおよびsvn moveコマンドを使用し、ファイルを編集します。

  3. svn statusおよびsvn diffコマンドを使用して、変更を確認します。

  4. 間違いを修正します。svn revertコマンドを使用すると、変更を取り消したり、中止することができます。

  5. 競合を解決します。競合が解決したら、svn resolveコマンドを使用してマークを付けます。

  6. svn commitまたはsvn ciコマンドを使用して、変更をコミットします。

図3-1は、SVN操作の完全なライフサイクルを示しています。

図3-1 SVNワークフロー

図3-1の説明が続きます
「図3-1 SVNワークフロー」の説明

継続的インテグレーションの開発プロセスでは、このワークフローはおおむね変わりません。非継続的インテグレーション・プロセスよりも、コミットされる変更のセットが小さく、より頻繁に発生する傾向があります。継続的インテグレーション・システムでインテグレーション・ビルドを実行できるように、ターゲット・リリース用のアクティブなトランクまたは分岐コードをコミットする必要があります。将来的にメインライン・コード・ベースにマージすることを意図した個人的な分岐の作成は避けてください。個人的な分岐およびマージの手法は統合を遅らせるもので、継続的インテグレーションの原則に反します。

Subversionプロジェクトの使用

Subversionプロジェクトを扱う際には、ファイルをローカル・ファイル・システムにチェックアウトします。次に、ファイルをリポジトリにコミットする準備ができたら、プロジェクトをチェックインします。

Subversionで管理されたプロジェクトの作業を開始するには、最初にファイルをローカル・ファイル・システムにチェックアウトする必要があります。SVNクライアントによって、各サブディレクトの.svnディレクトリにあるSubversionメタデータなどのプロジェクト・ファイルがシステムにコピーされます。

Subversionプロジェクトを使用するには:

  1. 次のコマンドを実行して、ファイルをチェックアウトします。
    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というディレクトリが作成され、プロジェクトの内容は再帰的にサーバーからディレクトリにコピーされます。

  2. チェックアウトされたファイルに対していくつでも変更を行うことができます。

    プロジェクトがいったんシステムにチェックアウトされた後は、そのソース・コードに対する後続のチェックアウトを実行する必要がなくなります。Subversionリポジトリの内容との同期を維持するために、チェックアウトされたディレクトリ、さらには個々のファイルに対してsvn updateを実行できます。

  3. リポジトリに変更をコミットする準備が整ったら、コミットするファイルまたはディレクトリをチェックインします。すべてのコンポーネントがチェックアウトされるディレクトリのメンバーであるかぎり、チェックインされるファイルまたはディレクトリのセットが、チェックアウトされたファイルまたはディレクトリのセットに対応している必要はありません。次のコマンドを実行して変更をコミットします。
    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
    

    競合を解決した後、通常のチェックイン操作を続行します。

  4. リポジトリにローカル変更をコミットする操作の前に、svn updateコマンドを実行して、最後のチェックアウトまたは更新以降に、他のユーザーによってコードにコミットされた変更を統合します。
    svn update
    
  5. 次のコマンドを実行して変更をコミットします。
    svn commit -m "description of the updates"

タグ付けと分岐に関する考慮事項

タグ付けによって分岐の名前付きポイント・イン・タイム・コピーが作成されます。

次の場合にタグがリリースされます。

  • プロジェクトがリリースされた場合

  • 重要なマイル・ストーンが発生した場合

リリースにタグを付けることが重要ですが、これは、タグによってパッチ適用リリースのための簡単なメカニズムが提供されるためです。あるリリースに不具合が見つかった場合、そのリリースのタグから分岐して、修正を行い、そのリリースのパッチを作成できます。後でこの新しい(パッチ適用済の)リリースに問題が見つかり、新しい問題に対する修正が必要になった場合には、このリリースにも同様にタグを付けます。

リリースにタグを付けなかった場合、そのリリースにビルドされている正確なコード行の取得が非常に難しくなります。

ノート:

タグ付きリリースは読取り専用アーティファクトとして取り扱います。タグを付けた後にリリースに対するマージを続行しないようにしてください。

Subversionクライアントについて

使用できるSubversionクライアントはいくつかあります。

この項では、2つの一般的なSubversionクライアントについて説明します。

WebSVN

WebSVNは、リポジトリに対するWebベースのビューを提供し、視覚的な差分、注釈および検索をサポートします。

WebSVNは、次からダウンロードできます。

https://websvnphp.github.io/download/

TortoiseSVN

TortoiseSVNは、Windowsエクスプローラと統合されるフリーのWindows Subversionクライアントです。標準的なSubversionクライアントのすべての操作をWindowsユーザー・インタフェースで実行できます。フォルダおよびファイル・アイコンのデコレータは、Subversionファイルのステータスを示します。コマンドライン・ツールはメニュー項目にマップされ、オプションはダイアログ・ボックスを介して構成可能です。また、Tortoiseでは高度でグラフィカルな差分と、競合の解決に役立つマージ・ツールも提供しています。

TortoiseSVNは、次からダウンロードできます。

http://tortoisesvn.net/

Subversionの詳細

このドキュメントは、Subversionを起動して実行するクイック・ガイドとして作成されているため、Subversionの操作について詳細は書かれていません。

詳細は、次の『Subversionによるバージョン管理』を参照してください。

http://svnbook.red-bean.com

ノート:

Subversionの知識がない場合は、『Subversionによるバージョン管理』を読むことをお薦めします。