SVN チェックアウトとは?初心者向けにわかりやすく解説
はじめに:バージョン管理システムと開発の課題
ソフトウェア開発や、ドキュメント作成、ウェブサイト制作など、複数のファイルやフォルダを扱って作業を進める上で、必ずと言って良いほど直面する課題があります。それは「変更の管理」です。
例えば、あなた一人でプログラムを開発しているとしましょう。ある日、新しい機能を追加するためにコードを大幅に修正しました。しかし、修正後にテストしてみると、以前は動いていた部分が動かなくなってしまいました。「あの修正をする前の状態に戻したいな」と思ったとき、どうしますか?
もし、バージョン管理システムを使っていなければ、あなたはきっとこんなことをしているかもしれません。
- ファイルを修正する前に、「
program.c
」を「program_backup_20231027.c
」のように日付を付けてコピーしておく。 - さらに修正を進めたら、「
program_backup_20231027_v2.c
」、「program_final_本当の最終版.c
」のようなファイル名の乱立を招く。 - どのファイルが最新で、どのファイルにどんな変更を加えたのかが分からなくなる。
これが、複数人で一つのプロジェクトに取り組むとなると、さらに複雑になります。
- Aさんがファイルを修正している間に、Bさんも同じファイルを修正してしまう。
- 後から保存したBさんの修正で、Aさんの修正が消えてしまう、あるいはその逆が発生する。
- 誰がいつ、どんな目的で変更を加えたのかが分からず、問題が発生したときに原因究明が困難になる。
- 以前の安定したバージョンに戻したいと思っても、どのファイル群がそのバージョンだったのかを特定するのが難しい。
これらの課題を解決するために生まれたのが、「バージョン管理システム(Version Control System, VCS)」です。バージョン管理システムは、ファイルやフォルダの変更履歴を記録し、管理するためのシステムです。これにより、いつ、誰が、どのような変更を加えたのかを追跡し、必要に応じて過去の特定の状態にいつでも戻すことができるようになります。また、複数の開発者が同じプロジェクトで並行して作業することを支援する機能も提供します。
バージョン管理システムの種類:集中型と分散型
バージョン管理システムにはいくつかの種類がありますが、大きく分けて「集中型バージョン管理システム(CVCS)」と「分散型バージョン管理システム(DVCS)」の二つに分類できます。
-
集中型バージョン管理システム (CVCS): CVS, Subversion (SVN) など
中央に一つのリポジトリ(後述)を置き、全ての開発者がその中央リポジトリに対して操作を行います。開発者は、中央リポジトリからファイルを取得し、ローカルで変更を加え、その変更を中央リポジトリに反映させます。作業には常に中央リポジトリへの接続が必要です。 -
分散型バージョン管理システム (DVCS): Git, Mercurial など
各開発者がリポジトリの完全なコピーをローカルに持ちます。開発者はローカルリポジトリに対して操作(コミットなど)を行い、その後、他の開発者や共有リポジトリと変更内容を交換します。オフラインでの作業が可能であり、中央リポジトリがダウンしても影響が少ないという特徴があります。
本記事で解説するSubversion(SVN)は、このうち「集中型バージョン管理システム(CVCS)」に分類されます。SVNは長年多くのプロジェクトで利用されており、特に組織内で共通のリポジトリを中心に開発を進める場合に適しています。
Subversion (SVN) とは
Subversionは、Apache Software Foundationによって開発されているオープンソースの集中型バージョン管理システムです。一般的に「SVN」という略称で知られています。SVNは、ファイルやフォルダの変更を効率的に追跡・管理するために設計されており、ネットワーク越しにアクセスできる単一の中央リポジトリを使用します。
SVNの基本的なコンセプトを理解するために、いくつかの重要な用語を先に押さえておきましょう。
- リポジトリ (Repository): プロジェクトの全てのファイル、フォルダ、そしてそれらの変更履歴が保存されている中央データベースです。SVNにおける「真実」であり、作業の起点となります。サーバー上に置かれるのが一般的です。
- リビジョン (Revision): リポジトリ内のファイルやフォルダの状態を記録したものです。変更がコミットされるたびに、リポジトリ全体の状態がスナップショットとして記録され、新しいリビジョン番号(連番)が割り振られます。リビジョン番号を指定することで、過去の特定時点の状態を正確に再現できます。
- ワーキングコピー (Working Copy): 開発者がローカルコンピューター上で実際に作業を行うために、リポジトリから取得したファイルやフォルダのコピーです。このワーキングコピー内でファイルの編集、追加、削除などの作業を行います。
- コミット (Commit): ローカルのワーキングコピーで行った変更内容を、リポジトリに反映させる操作です。コミットが成功すると、リポジトリに新しいリビジョンが作成され、変更内容が永続的に記録されます。
- アップデート (Update): リポジトリに他の開発者がコミットした最新の変更内容を、自分のワーキングコピーに取り込む操作です。これにより、自分のワーキングコピーを最新の状態に保つことができます。
- チェックアウト (Checkout): 本記事の主題です。リポジトリからプロジェクトのファイル一式をローカルに取得し、初めてワーキングコピーを作成する操作です。
これらの用語の関係性を簡単なワークフローで見てみましょう。
- 初めてプロジェクトに参加する開発者は、リポジトリから「チェックアウト」を行い、ローカルに「ワーキングコピー」を作成します。
- 開発者は、ワーキングコピー内のファイルを編集します。
- 他の開発者がリポジトリに新しい変更を「コミット」することがあります。
- 自分のワーキングコピーで作業を続ける前に、他の開発者の変更を取り込むために「アップデート」を行います。
- 自分の作業が一段落したら、変更内容を「コミット」してリポジトリに反映させます。これにより、リポジトリに新しい「リビジョン」が生まれます。
この一連の流れの中で、「チェックアウト」は開発者がプロジェクトに最初に参加し、ローカルでの作業を開始するための、まさに「最初のステップ」となる操作です。
SVNリポジトリとは
チェックアウトを理解するためには、まずリポジトリについてもう少し詳しく知る必要があります。
リポジトリは、SVNにおけるプロジェクトの中央集権的なデータストアです。プロジェクトの全てのファイル、フォルダ、そして最も重要な「変更履歴」がここに集約されて保存されています。リポジトリは通常、サーバー上に置かれ、開発者はネットワーク経由でアクセスします。
リポジトリは単なるファイルサーバーとは異なります。SVNはファイルの内容の差分(デルタ)を効率的に管理することで、過去の全てのリビジョンの状態を復元できるようになっています。また、ファイルの追加、削除、移動、コピーなども正確に追跡します。
多くのSVNリポジトリでは、慣習的に以下のようなフォルダ構造が採用されています。
trunk/
: メインの開発ラインです。通常、ここが最新の不安定な(開発中の)コードを置く場所になります。branches/
: 開発中のメインラインから分岐させた、特定の機能開発や実験的な試みを行うためのブランチを置く場所です。tags/
: 特定のリビジョンに名前を付ける(タグ付けする)ことで、重要な時点(例: リリースバージョン)を記録するための場所です。タグは通常、変更を加えない(静的な)ブランチとして扱われます。
この構造は必須ではありませんが、多くのSVNユーザーに受け入れられている標準的な方法です。チェックアウトを行う際には、リポジトリのどの部分(例えばtrunk
全体や特定のブランチ)を取得したいのかを指定することになります。
リポジトリにアクセスするためには、リポジトリURLが必要です。これは、ウェブサイトのURLのように、リポジトリの場所を示すアドレスです。例えば、svn://example.com/myproject/
や https://svn.example.com/repos/myproject/
のようになります。チェックアウトの際には、このリポジトリURLをSVNクライアントに伝える必要があります。
チェックアウト(Checkout)とは – 本題
それでは、いよいよチェックアウト(Checkout)について詳しく見ていきましょう。
チェックアウトとは、SVNリポジトリから指定されたパス(例えばプロジェクト全体や特定のブランチ)にあるファイルやフォルダを、ローカルコンピューター上の指定したディレクトリにコピーし、そのコピーを「ワーキングコピー」として初期化する操作です。
簡単に言えば、「SVNで管理されているプロジェクトのファイルを、自分のパソコンに初めて持ってくること」です。
なぜチェックアウトが必要なのでしょうか?それは、あなたがそのプロジェクトで作業を開始するための「出発点」となるからです。リポジトリにあるファイルは、直接編集することはできません。編集するためには、一度自分の手元にコピーを持ってきて、そこで自由に変更を加える必要があります。チェックアウトは、その「自分の手元にコピーを持ってくる」最初のプロセスなのです。
チェックアウトを行うことで、ローカルに取得したファイル群は単なるコピーではなく、特別な管理下の状態になります。これが「ワーキングコピー」です。ワーキングコピーには、SVNがバージョン管理を行うために必要な情報が隠しファイルとして含まれています(詳細は後述)。これにより、SVNクライアントはワーキングコピーの状態(どのリビジョンに基づいているか、ファイルに変更があるかなど)を把握し、コミットやアップデートといった後続の操作を行うことができるようになります。
チェックアウトが必要となる具体的な場面としては、以下のようなケースが考えられます。
- 初めてSVNプロジェクトに参加する: プロジェクトのコードを初めて自分のコンピューターにセットアップする場合。
- 新しい開発環境を構築する: 別のコンピューターで作業を開始する場合や、オペレーティングシステムを再インストールした場合など。
- 特定の古いバージョンのコードを確認・修正する: 例えば、過去のリリースバージョンのバグを修正する必要がある場合など、特定のリビジョンを基にしたワーキングコピーが必要な場合。(ただし、この場合はブランチやタグをチェックアウトするか、チェックアウト後に目的のリビジョンにスイッチすることが多いです)
- 別のワーキングコピーが必要: 同じプロジェクトでも、同時に複数の異なるブランチやリビジョンで作業したい場合。
要するに、ローカルに作業用のコピーがまだ存在しない状態で、リポジトリからファイルを取得して作業を開始する際に、チェックアウトを行います。
チェックアウトの仕組み
チェックアウトコマンドを実行すると、SVNクライアントは指定されたリポジトリURLにアクセスします。リポジトリから、指定されたパス(例えば/trunk
)に含まれる最新リビジョン(特に指定しない場合)のファイルやフォルダのデータが取得されます。
取得されたファイルやフォルダは、ローカルコンピューター上の指定したディレクトリに配置されます。このとき、取得したファイル群のルートディレクトリの直下、およびサブディレクトリの各階層に、特別な隠しディレクトリが作成されます。これが.svn
ディレクトリ(バージョン1.7以降ではワーキングコピーのルート直下のみに.svn
ディレクトリがあり、その中にメタデータが集中管理される方式が主流になっています)です。
この.svn
ディレクトリの中には、そのワーキングコピーがリポジトリのどのURL、どのリビジョンに基づいているか、各ファイルのオリジナルの状態(チェックアウトした時点や最後にアップデートした時点の状態)などが記録されています。SVNクライアントは、この.svn
ディレクトリに保存された情報を使って、ローカルでの変更を検知したり、リポジトリとの差分を計算したり、アップデートやコミットといった操作を実行したりします。
つまり、チェックアウトは単にファイルをコピーするだけでなく、ローカルディレクトリをSVNの管理下に置くための「初期化処理」も含んでいると言えます。この.svn
ディレクトリの存在が、単なるコピーとワーキングコピーを区別する重要な点です。.svn
ディレクトリがないディレクトリは、SVNからはバージョン管理されていない普通のファイル群とみなされます。
チェックアウトの具体的な手順
SVNでのチェックアウトは、主に「コマンドライン」または「GUIツール」を使って行います。ここではそれぞれの代表的な方法を解説します。
コマンドラインでの手順
SVNクライアントがインストールされている環境であれば、ターミナルやコマンドプロンプトからsvn
コマンドを使って操作できます。チェックアウトのコマンドはsvn checkout
またはその省略形であるsvn co
です。
基本構文は以下の通りです。
bash
svn checkout リポジトリURL [ローカルディレクトリ名] [オプション]
または
bash
svn co リポジトリURL [ローカルディレクトリ名] [オプション]
リポジトリURL
: チェックアウトしたいリポジトリのパスを指定します。例えばsvn://example.com/myproject/trunk
やhttps://svn.example.com/repos/myproject/tags/1.0.0
のように指定します。[ローカルディレクトリ名]
: リポジトリの内容をローカルに取得して作成するディレクトリ名を指定します。この引数を省略した場合、リポジトリURLの末尾のパス名がディレクトリ名として使用されます。(例:svn://example.com/myproject/trunk
を指定した場合、ローカルにtrunk
というディレクトリが作成される)[オプション]
: チェックアウトの挙動を調整するためのオプションを指定します。(後述)
例1:最新リビジョンをチェックアウトする
リポジトリの myproject/trunk
の内容を、カレントディレクトリに myproject_trunk
という名前のディレクトリとしてチェックアウトする場合。
bash
svn checkout svn://example.com/repos/myproject/trunk myproject_trunk
または、ローカルディレクトリ名を省略して、リポジトリURLの末尾の名前(trunk
)をそのままディレクトリ名として使う場合。
bash
svn checkout svn://example.com/repos/myproject/trunk
このコマンドを実行すると、カレントディレクトリに trunk
というディレクトリが作成され、その中にリポジトリの trunk
の内容が最新リビジョンで取得されます。
実行時には、SVNクライアントがリポジトリにアクセスし、ファイルを取得している様子がコンソールに表示されます。
A trunk/readme.txt
A trunk/src/main.c
A trunk/include/header.h
...
チェックアウトしました。リビジョン 1234。
A
は「追加 (Added)」されたファイルやディレクトリを示しています。最後に表示される「リビジョン 1234」は、チェックアウトした時点のリポジトリの最新リビジョンです。
例2:特定のリビジョンをチェックアウトする
過去のリビジョン(例えばリビジョン 100)の状態をチェックアウトしたい場合は、-r
オプションを使います。
bash
svn checkout -r 100 svn://example.com/repos/myproject/trunk myproject_r100
このコマンドは、リポジトリの myproject/trunk
の内容を、リビジョン 100 の時点の状態で myproject_r100
というディレクトリにチェックアウトします。
特定のリビジョンをチェックアウトすることは、過去のバージョンを調べたり、その時点でのバグを再現したりする場合に便利です。ただし、このワーキングコピーはリビジョン100に基づいているため、通常のリポジトリの最新状態(HEADリビジョン)に追従して開発を続けたい場合は、後でアップデートが必要になります。
認証が必要な場合
リポジトリにアクセスするためにユーザー名とパスワードが必要な場合、チェックアウトコマンドの実行中にプロンプトが表示され、入力が求められます。
bash
Authentication realm: <svn://example.com:3690> My Project Repository
Username: your_username
Password for 'your_username':
正しい情報を入力すれば、チェックアウトが続行されます。パスワードを毎回入力するのが面倒な場合は、SVNクライアントがパスワードをキャッシュする機能を提供している場合があります。
GUIツールでの手順
多くの開発者は、より直感的に操作できるGUIツールを利用します。Windows環境ではTortoiseSVNが非常によく使われています。ここではTortoiseSVNを使ったチェックアウトの手順を例に説明します。
- チェックアウト先ディレクトリの指定: ファイルをチェックアウトしたい場所(ローカルコンピューター上のフォルダ)をエクスプローラーで開きます。新しいフォルダを作成しておいても構いません。
- コンテキストメニューを開く: そのフォルダの背景(ファイルやサブフォルダがない場所)で右クリックします。
- 「SVN Checkout…」を選択: 右クリックメニューの中に、TortoiseSVNの項目があります。「SVN Checkout…」を選択します。
- チェックアウトダイアログの設定:
- URL of repository: チェックアウトしたいリポジトリのURLを入力します。(例:
https://svn.example.com/repos/myproject/trunk
) - Checkout directory: チェックアウト先のローカルディレクトリパスが表示されます。通常は右クリックしたディレクトリが自動入力されますが、必要に応じて変更できます。(例:
C:\WorkingCopies\myproject_trunk
) - Revision: チェックアウトしたいリビジョンを指定します。デフォルトは
HEAD revision
(最新リビジョン)です。特定のリビジョンをチェックアウトしたい場合は、Revision
を選択し、リビジョン番号を入力するかShow log
でログを表示して選択します。 - その他のオプション(Depthなど)が必要であれば設定します。
- URL of repository: チェックアウトしたいリポジトリのURLを入力します。(例:
- 「OK」をクリック: 設定が完了したら「OK」ボタンをクリックします。
- 認証: 認証が必要な場合は、ユーザー名とパスワードを入力するダイアログが表示されます。
- チェックアウトの実行: SVNクライアントがリポジトリにアクセスし、ファイルの取得が開始されます。進捗状況が表示されます。
- 完了: チェックアウトが成功すると、完了を示すメッセージが表示されます。「OK」をクリックしてダイアログを閉じます。
チェックアウトが完了すると、指定したローカルディレクトリの中に、リポジトリから取得したファイルやフォルダが配置されます。TortoiseSVNの場合、ワーキングコピーのフォルダやファイルには、SVNの状態を示すアイコン(緑色のチェックマークなど)が表示されるようになります。
MacやLinuxでも、グラフィカルなSVNクライアントが存在し、同様の手順でチェックアウトを行うことができます。基本的には「リポジトリの場所」と「ローカルの取得先」を指定するという流れになります。
GUIツールは、内部的にはsvn checkout
コマンドを実行していますが、リポジトリURLの履歴を管理したり、ログをグラフィカルに表示してリビジョンを選びやすくしたりするなど、コマンドラインに比べて使いやすさが向上しています。初心者の方には、まずGUIツールから始めるのがおすすめです。
チェックアウトのオプション
svn checkout
コマンドには、様々なオプションがあり、チェックアウトの挙動を細かく制御できます。いくつか重要なオプションを紹介します。
-
-r <リビジョン>, --revision <リビジョン>
: 指定したリビジョンの状態をチェックアウトします。<リビジョン>
には、リビジョン番号(例:100
)、リビジョンを表すキーワード(HEAD
– 最新リビジョン,BASE
– ワーキングコピーの基点リビジョン,COMMITTED
– 最後に変更があったリビジョン,PREV
– COMMITTEDの1つ前のリビジョン)、または日付(例:{2023-10-27}
)を指定できます。- デフォルトは
HEAD
です。 - 例:
svn co -r 100 svn://.../trunk
- 例:
svn co -r {2023-10-27T10:00:00Z} svn://.../trunk
(UTC時刻指定)
-
--depth <種類>
: チェックアウトする深さを指定します。大規模なリポジトリで、必要な部分だけを取得したい場合に便利です。「疎なワーキングコピー(Sparse Working Copy)」を作成するために使用します。empty
: 指定したディレクトリ自体は作成するが、その中のファイルやサブディレクトリは何も取得しない。files
: 指定したディレクトリと、その直下にあるファイルのみを取得する。サブディレクトリは取得しない。immediates
: 指定したディレクトリと、その直下にあるファイルおよびサブディレクトリ(ただし、サブディレクトリの中身は取得しない)を取得する。infinity
: 指定したディレクトリ以下の全てのファイルとサブディレクトリを再帰的に取得する(これがデフォルトの挙動)。- 例:
svn co --depth empty svn://.../myproject/trunk trunk
(trunkディレクトリだけを作成し、中身は後からsvn update --depth
で取得する場合などに使う)
-
-q, --quiet
: チェックアウト中の情報を少なく表示します。スクリプトなどから実行する場合に有用です。 -
--force
: いくつかの状況で強制的に処理を実行します。例えば、チェックアウト先のディレクトリが既に存在し、かつ空ではない場合に、通常はエラーになりますが、--force
を使うと警告を出して続行させることができます(ただし、上書きのリスクがあるので注意が必要です)。
これらのオプションを組み合わせることで、様々なニーズに応じたチェックアウトが可能になります。特に--depth
オプションは、リポジトリの一部だけが必要な場合や、チェックアウトにかかる時間やディスク容量を節約したい場合に役立ちます。
ワーキングコピーの構造と状態
チェックアウトによって作成されたワーキングコピーは、SVNが管理するために特別な構造を持っています。前述の.svn
ディレクトリがその鍵となります。
SVN 1.7以降では、ワーキングコピーのルートディレクトリ直下にのみ.svn
ディレクトリが作成され、プロジェクト全体のメタデータが一元管理されています。これに対し、SVN 1.6以前では、ワーキングコピー内の全てのディレクトリに.svn
ディレクトリが再帰的に作成されていました。現在主流のSVN 1.7以降の方式の方が効率的で、ワーキングコピーのサイズも小さくなる傾向があります。
.svn
ディレクトリの中には、以下のような情報が含まれています(具体的なファイル構造はバージョンによって異なりますが、概念としては以下の情報が保存されています)。
- エントリ情報: ワーキングコピー内の各ファイルやディレクトリが、リポジトリのどのパスに対応し、どのリビジョンに基づいているかなどの情報。
- オリジナルのファイルコピー: 最後にリポジトリから取得またはアップデートした時点のファイルの内容が保存されている場合があります。これにより、ローカルでの変更(差分)を素早く計算できます。
- ログやプロパティの情報: SVNが内部的に使用する様々な管理情報。
この.svn
ディレクトリを削除してしまうと、そのディレクトリはSVNのワーキングコピーではなくなり、単なるファイルの集まりになってしまいます。誤って削除しないように注意しましょう。
ワーキングコピーの状態を確認するには、svn status
コマンドを使用します。このコマンドは、ワーキングコピー内でリポジトリの状態から変更があったファイルや、SVNの管理下にないファイルなどを一覧表示します。
svn status
の出力例:
M src/main.c # main.cが修正されている
A src/new_feature.h # new_feature.hが新しく追加されている
D old_file.txt # old_file.txtが削除されている
? temp_file.log # temp_file.logはSVN管理下ではない(新規作成されたがaddされていない)
! missing_file.conf # missing_file.confはローカルで削除されたがSVNにその変更が伝えられていない
C config.ini # config.iniはマージの衝突が発生している
これらの記号(M, A, D, ?, !, Cなど)を見ることで、ワーキングコピーが現在どのような状態にあるのかを把握できます。チェックアウトした直後は、通常は何も変更がない状態 (?
のファイル以外) になります。
ワーキングコピーがリポジトリのどのリビジョンを基にしているかを確認するには、svn info
コマンドをワーキングコピーのルートディレクトリで実行します。
svn info
の出力例:
Path: .
Working Copy Root Path: /path/to/myproject_trunk
URL: svn://example.com/repos/myproject/trunk
Relative URL: ^/trunk
Repository Root: svn://example.com/repos/myproject
Repository UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Revision: 1234 # このワーキングコピーが基づいているリビジョン
Node Kind: directory
Schedule: normal
Depth: infinity
...
Revision
の項目が、チェックアウトまたは最後にアップデートしたリビジョンを示しています。
チェックアウトと他のSVN操作との違い
SVNを使い始めると、「チェックアウト」「アップデート」「スイッチ」「エクスポート」といった似たような操作が出てきます。これらの違いを明確に理解しておくことが重要です。
-
チェックアウト (Checkout):
- 目的: リポジトリから初めてファイル群を取得し、新しいワーキングコピーを作成すること。
- 対象: ローカルにまだSVN管理下のディレクトリがない状態。
- 結果: ローカルに
.svn
ディレクトリを含むワーキングコピーが作成される。 - 頻度: プロジェクトへの参加や新しい環境構築時に一度だけ行う(あるいは、別のブランチやタグのワーキングコピーが必要な場合に別途行う)。
-
アップデート (Update):
- 目的: 既存のワーキングコピーを、リポジトリの最新または指定したリビジョンの状態に「更新」すること。他の開発者がコミットした変更などを自分のワーキングコピーに取り込む。
- 対象: 既にSVN管理下にある(
.svn
ディレクトリがある)ワーキングコピー。 - 結果: ワーキングコピー内のファイルが変更・追加・削除され、ワーキングコピーの状態が更新される。ローカルでの変更とリポジトリでの変更が競合した場合は、コンフリクト(衝突)が発生することもある。
- 頻度: 開発中に他の開発者の変更を取り込むため、頻繁に行う。
-
スイッチ (Switch):
- 目的: 既存のワーキングコピーが参照するリポジトリのパスを、別のブランチやタグに「切り替える」こと。
- 対象: 既にSVN管理下にあるワーキングコピー。
- 結果: ワーキングコピーの内容が、切り替え先のブランチ/タグの状態に更新される。アップデートに似ているが、対象となるリポジトリのパスが変わる点が異なる。
- 頻度: 異なるブランチ間で作業を切り替える際などに行う。
-
エクスポート (Export):
- 目的: リポジトリまたはワーキングコピーからファイル群を取得するが、SVNの管理情報(.svnディレクトリ)を含まないクリーンなコピーを作成すること。
- 対象: リポジトリまたは既存のワーキングコピー。
- 結果: SVN管理下ではない、単なるファイルとフォルダのコピーが作成される。
- 頻度: ソースコードをビルドしたり、配布したりする場合など、バージョン管理情報が必要ない「成果物」を作成する際に行う。
これらの違いを整理すると、チェックアウトは「最初にもってくる」、アップデートは「持っているものを最新にする/他人の変更を取り込む」、スイッチは「持っているものを別の系統のものに切り替える」、エクスポートは「管理情報なしで持ってくる」となります。
特にチェックアウトとアップデートは混同しやすいですが、チェックアウトはワーキングコピーの「新規作成」、アップデートは「既存ワーキングコピーの更新」という点が決定的な違いです。
チェックアウト時の注意点とトラブルシューティング
チェックアウトを行う際に遭遇する可能性のある問題や、注意すべき点をいくつか挙げます。
- リポジトリURLの間違い: 最も基本的なミスです。URLが間違っていると、リポジトリにアクセスできずエラーになります。URLのスペル、プロトコル(
svn://
,http://
,https://
,file:///
など)、ポート番号などを確認してください。 - ネットワーク接続の問題: SVNは中央リポジトリにネットワーク経由でアクセスします。サーバーへの接続ができない(サーバーがダウンしている、ネットワークに問題がある、ファイアウォールでブロックされているなど)場合はチェックアウトできません。VPN接続が必要な場合もあります。
- 認証情報の不足/間違い: リポジトリにアクセス制限がある場合、ユーザー名とパスワードの入力が求められます。情報が間違っているとアクセス拒否されます。権限がないユーザーではチェックアウトできない場合もあります。
- ローカルディスク容量の不足: プロジェクトのサイズが大きい場合、チェックアウト先のローカルディスクに十分な空き容量が必要です。容量が足りないとエラーで中断されます。
- チェックアウト先ディレクトリの存在: チェックアウト先のローカルディレクトリを明示的に指定した場合、そのディレクトリが存在しない場合は自動的に作成されます。ただし、既に存在していて、かつ空ではないディレクトリにチェックアウトしようとすると、通常はエラーになります(
--force
オプションを使わない限り)。既存のディレクトリにチェックアウトしたい場合は、中身が空であることを確認するか、--force
オプションを慎重に使用してください。 - プロキシ設定: 企業のネットワークなどでは、インターネットアクセスにプロキシサーバーを経由する必要がある場合があります。SVNクライアントにプロキシ設定が必要な場合は、適切に設定してください。(通常は
~/.subversion/servers
ファイルで設定します)。 - 特定リビジョンでのチェックアウト:
-r
オプションで特定リビジョンをチェックアウトした場合、そのワーキングコピーは指定リビジョンに基づいています。その後の開発を最新リビジョンで行う場合は、まず最新リビジョンにアップデート (svn update
) する必要があることを忘れないでください。特定リビジョンをチェックアウトするのは、過去の調査や特定のタグからの開発など、目的が明確な場合が良いでしょう。
もしチェックアウト中にエラーが発生した場合は、表示されるエラーメッセージをよく確認してください。ほとんどの場合、エラーメッセージに対処方法の手がかりが含まれています。
チェックアウト後の基本的なワークフロー
チェックアウトが完了し、ワーキングコピーが手に入ったら、いよいよ開発作業を開始できます。チェックアウト後の一般的なワークフローは以下のようになります。
- ファイル編集: ワーキングコピー内のファイルをテキストエディタやIDEで開いて、コードを記述したり、ドキュメントを修正したりします。新しいファイルを作成したり、不要になったファイルを削除したりすることもあります。
- 状態確認:
svn status
コマンドやGUIツールの機能を使って、どのファイルに変更を加えたか、どのファイルを新規作成したかなどを確認します。これにより、自分の作業内容を把握できます。 - 差分確認:
svn diff
コマンドやGUIツールの機能を使って、変更内容を詳細に確認します。意図しない変更が含まれていないか、リポジトリの状態からどのように変わったのかを確認します。 - 新しいファイルの追加: 新規に作成したファイルは、デフォルトではSVNの管理下ではありません。
svn add
コマンドを使って、SVNの管理対象に追加する必要があります。 - ファイルの削除/移動: ファイルを削除または移動した場合も、
svn delete
やsvn move
コマンド(またはGUIツールでの操作)を使って、その変更をSVNに伝える必要があります。単にエクスプローラーなどでファイルを削除・移動した場合、SVNからは「missing」(見つからない)または「unversioned」(管理下ではない)と認識されます。 - コミット: 自分の作業が一段落し、変更内容をリポジトリに保存したい場合は、
svn commit
コマンド(またはGUIツールの機能)を使います。コミット時には、どのような変更を行ったのかを示す「コミットメッセージ」を記述します。コミットに成功すると、リポジトリに新しいリビジョンが作成され、あなたの変更が他の開発者と共有できるようになります。
共同で開発している場合は、コミットする前に、他の開発者が追加した変更を自分のワーキングコピーに取り込むために「アップデート」を行うのが一般的です。これにより、自分の変更と他の人の変更をマージし、コンフリクトを防いだり、コンフリクトが発生した場合に解決したりすることができます。
チェックアウトは、この一連の開発サイクルの最初の「開始」地点に過ぎません。チェックアウトで取得したワーキングコピーを使い、編集・アップデート・コミットを繰り返しながらプロジェクトを進めていくことになります。
発展的なトピック:部分的なチェックアウト(Sparse Checkout)
前述のオプションで触れた--depth
オプションを使ったチェックアウトは、「疎なワーキングコピー(Sparse Working Copy)」と呼ばれ、特に大規模なリポジトリを扱う場合に役立ちます。
例えば、リポジトリに非常に多くのプロジェクトやモジュールが含まれており、あなたが作業するのはその中の特定のディレクトリだけで良い場合を考えます。デフォルト(--depth infinity
)でチェックアウトすると、リポジトリ全体の膨大なファイルがローカルにコピーされ、時間もディスク容量も無駄になります。
このような場合に--depth
オプションを使います。
例: myproject
リポジトリに moduleA
, moduleB
, docs
というディレクトリがあり、moduleA
だけを深く(中身全て)取得し、他のトップレベルディレクトリは浅く取得したい場合。
まず、ルートディレクトリを --depth empty
でチェックアウトします。
bash
svn co --depth empty svn://example.com/repos/myproject myproject_wc
これで、ローカルに myproject_wc
ディレクトリが作成され、その中に.svn
管理情報がセットアップされますが、リポジトリのファイルやサブディレクトリはほとんど取得されません。
次に、必要なサブディレクトリ(moduleA
)を深く取得します。これは、ワーキングコピーのルートディレクトリに移動してからsvn update
コマンドに--depth
オプションと対象パスを指定して行います。
bash
cd myproject_wc
svn update --depth infinity moduleA
これで、myproject_wc/moduleA
ディレクトリとその中身が全て取得されます。他のディレクトリ(moduleB
, docs
)はまだ浅いまま(または全く存在しない状態)です。
必要に応じて、moduleB
や docs
ディレクトリを --depth empty
や --depth files
などで浅く取得することもできます。
bash
svn update --depth empty moduleB
svn update --depth empty docs
これにより、myproject_wc
ディレクトリの直下には moduleA
(中身あり)、moduleB
(中身なし)、docs
(中身なし) といった構造ができます。特定のディレクトリが必要になったら、そのディレクトリに対して再度svn update --depth infinity
を実行すれば良いわけです。
Sparse Checkoutを適切に利用することで、チェックアウトやアップデートにかかる時間を短縮し、ローカルのディスク容量を節約できます。
まとめ:チェックアウトはSVN開発の始まり
SVNのチェックアウト(Checkout)について、その基本的な概念から具体的な手順、仕組み、関連する操作との違い、そして応用的な使い方まで詳しく解説しました。
チェックアウトは、SVNを使ったバージョン管理プロジェクトに参加し、開発を開始するための最初の、そして非常に重要なステップです。リポジトリからプロジェクトのファイル群を取得し、SVNが管理できる「ワーキングコピー」をローカルに作成することで、あなたは初めてそのプロジェクトのファイルに手を加え、バージョン管理の恩恵を受けながら開発を進めることができるようになります。
初めてSVNを使う方にとっては、リポジトリやワーキングコピーといった概念が少し難しく感じられるかもしれませんが、チェックアウトは「中央にある設計図や資料一式を、自分の作業スペースにコピーして持ってくる」というイメージで捉えると分かりやすいでしょう。そして、その持ってきたコピーはSVNによって特別な管理がされている、ということです。
チェックアウトが完了したら、次はワーキングコピーでのファイル編集、そしてその変更をリポジトリに記録するコミット、他の人の変更を取り込むアップデートといった操作に進んでいきます。これらの操作を繰り返しながら、チームで効率的に、かつ安全にプロジェクトを進行させていくことができるのが、バージョン管理システムの最大の利点です。
本記事が、SVNのチェックアウトとは何か、そしてそれがどのように使われるのかを理解する一助となれば幸いです。さあ、チェックアウトを済ませて、SVNでの開発作業を始めてみましょう!