リポジトリへのデータインポート

インポート

すでにいくつかのプロジェクトが登録されている、既存リポジトリにインポートする場合、リポジトリ構造はすでに決まっていることでしょう。新しいリポジトリにデータをインポートする場合には、どのようにリポジトリを構成するかを考えるのに、時間を費やす価値はあります。もっと深いアドバイスが必要であれば、リポジトリレイアウト項 をお読みください。

この節では、ディレクトリ階層をリポジトリへ一度にインポートするよう設計された、Subversion の import コマンドについて説明しています。これは動作しますが、以下のようにいくつか欠点があります。

  • 含めるファイルやフォルダを選択する方法が、共通無視設定を除いて存在しません。

  • インポートしたフォルダが作業コピーになりません。サーバからファイルをコピーし直すのに、チェックアウトしなければなりません。

  • 間違ったフォルダ階層を、リポジトリに簡単にインポートしてしまいます。

このため、import コマンドをまったく使わず、むしろ、その場でインポート項 で説明する、2 段階法に従うのをお勧めします。しかし、あなたは今、基本的な import コマンドがどのように動作するかを説明する場にいます……

リポジトリにプロジェクトをインポートする前に、以下を行ってください。

  1. プロジェクトの構築に必要ないファイル (一時ファイル、*.obj といったコンパイラが生成したファイル、コンパイルしたバイナリ) は削除してください。

  2. フォルダやサブフォルダにファイルを構成してください。あとでファイルは削除・移動できますが、インポートの前にプロジェクトの構造をしっかり決めておくことを強くお勧めします。

今度は Windows エクスプローラのプロジェクトディレクトリ構造のトップレベルフォルダを選択し、右クリック でコンテキストメニューを出してください。TortoiseSVNインポート... コマンドを選択し、ダイアログボックスを表示します。

図 5.6. インポートダイアログ

インポートダイアログ


このダイアログに、プロジェクトにインポートしたいリポジトリの場所を示す、URL を入力しなければなりません。インポートしようとするローカルフォルダ自体が現れるのではなく、その中身がリポジトリに現れるということに気づくのは重要です。例えば以下の構造があるとします。

C:\Projects\Widget\source
C:\Projects\Widget\doc
C:\Projects\Widget\images

ここで、C:\Projects\Widgethttp://mydomain.com/svn/trunk にインポートすると、Widget サブディレクトリではなく、その中のサブディレクトリが直接 trunk の中にあるのに驚くかもしれません。URL の一部として、http://mydomain.com/svn/trunk/Widget-X のようにサブディレクトリを指定する必要があります。import コマンドは、リポジトリの中にサブディレクトリがない場合、自動的に作成することに注意してください。

インポートメッセージは、ログメッセージとして使われます。

デフォルトでは、共通無視パターンにマッチしたファイル・フォルダはインポートされません。この動作を上書きするには、無視されたファイルを含む チェックボックスを使用してください。共通無視パターンの設定の詳細は 一般設定項 をご覧ください。

OK を押すと、TortoiseSVN は全てのファイルが入った完全なディレクトリを、リポジトリにインポートします。これでプロジェクトがバージョン管理下にあるリポジトリに格納されました。インポートしたフォルダは、バージョン管理下に入らないことに注意してください! バージョン管理下の 作業コピー を取得するには、インポートしたときのバージョンをチェックアウトする必要があります。もしくは、フォルダをその場でインポートする方法をご覧ください。

その場でインポート

既にリポジトリがあると仮定したときに、新しいフォルダ構造を追加する場合、以下の手順にしたがってください。

  1. リポジトリブラウザを使用して、リポジトリに直接プロジェクトフォルダを作ってください。

  2. インポートしたいフォルダのトップで新しいフォルダをチェックアウトしてください。ローカルフォルダが空でないという警告が出ます。これでバージョン管理下にあるトップレベルフォルダに、バージョン管理外の内容があることになります。

  3. バージョン管理下のフォルダ上で TortoiseSVN追加... を使い、内容の一部または全部を追加してください。ファイルの追加や削除、フォルダへの svn:ignore 属性の設定など、必要な変更を加えることができます。

  4. トップレベルフォルダをコミットしてください。これで新しいバージョン管理下のツリーと、既存フォルダから作成したローカルの作業コピーを得られます。

特殊ファイル

時々、バージョン管理下のファイルにユーザごとのデータを含める必要があります。全てのユーザ・開発者が手元の環境をセットアップするときに、修正しなければならないファイルがあるということです。しかしそういったファイルは、ユーザがそれぞれいつでもリポジトリにコミットしてしまえるために、バージョン管理が難しいのです。

そういった場合、テンプレート ファイルを使うのをお勧めします。開発者が必要な全てのデータを含むファイルを作成し、そのファイルをバージョン管理下に置きます。開発者のそのファイルをチェックアウトします。それから、開発者ごとにそのファイルの コピーを作成 し、名前を変更します。そうするとコピーを変更してもなんの問題もありません。

たとえば、TortoiseSVN のビルドスクリプトを参照してください。このファイルの名前は TortoiseVars.bat ですが、リポジトリにはありません。TortoiseVars.tmpl ファイルがあるだけです。TortoiseVars.tmpl はテンプレートファイルで、開発者ごとにコピーを作成し、 TortoiseVars.bat と名前を変更するようになっています。このファイルの中には、ユーザがどの行を編集・変更すればいいか判るように、セットアップのしかたをコメントとして追加しています。

ユーザが不安にならないように、TortoiseVars.bat を親フォルダの無視リストに追加してあります。つまり、Subversion の svn:ignore 属性をそのファイルにセットしています。これにより (バージョン管理外のファイルのよう) コミットごとに表示されることがなくなります。

参照プロジェクト

時には、たくさんの異なるチェックアウトから作業コピーを構成するのは、便利なことがあります。たとえば、リポジトリ内の異なる場所もしくは異なるリポジトリにある、異なるサブディレクトリが必要になるかもしれません。全てのユーザに同じレイアウトを保持して欲しければ、svn:externals 属性を設定できます。

では /project1 の作業コピーを D:\dev\project1 にチェックアウトしましょう。D:\dev\project1 フォルダを選択し、右クリック してコンテキストメニューのWindows メニュープロパティ+追加...+設定

ティップ

前述のように、外部参照定義のすべてにおいて、明示的なリビジョン番号を使用することを強く意識するべきです。そうすることは、異なる外部参照情報のスナップショットを取り出す際、正確にどのスナップショットを取り出すかを決めることを意味します。コントロールが及ばないサードパーティのリポジトリに変更があっても驚かないと言う常識に加え、明示的なリビジョン番号を使用するということは、作業コピーを以前のリビジョンに戻すということでもあります。外部参照定義はまた、以前のリビジョンを見るように元に戻り、リポジトリが過去のリビジョンになっているなら、外部参照の作業コピーは一致するように以前を参照するように更新されます。ソフトウェアプロジェクトにおいて、これは複雑な古いコードベースを構築するのが成功するか失敗するかと言った違いに現れます。

外部プロジェクトが同じリポジトリにある場合、メインプロジェクトをコミットしたときに、外部プロジェクトに行った変更もコミットされてしまいます。

外部プロジェクトが別のリポジトリにある場合、メインプロジェクトのコミット時に、外部プロジェクトに対する変更は通知されますが、別々にコミットする必要があります。

svn:externals の定義に絶対 URL を使用し、作業コピーを再配置しなければならない (つまり、リポジトリの URL を変更する) 場合、外部参照は変化せず、もう動作しないかも知れません。

このような問題を避けるため、Subversion クライアントバージョン 1.5 以降では、相対外部参照 URL をサポートします。相対 URL を指定する 4 つの異なる方法をサポートしています。以下の例では、2 つのリポジトリ (http://example.com/svn/repos-1http://example.com/svn/repos-2) があると仮定します。C:\Workinghttp://example.com/svn/repos-1/project/trunk のチェックアウトがあり、トランクに svn:externals プロパティをセットしています。

親ディレクトリへの相対パス

この URL は、以下の例のように、常に ../ という文字列で始まります。

../../widgets/foo  common/foo-widget

これは、C:\Working\common\foo-widgethttp://example.com/svn/repos-1/widgets/foo を抽出します。

URL が、ディスクに書かれている外部参照のディレクトリではなく、svn:externals 属性にあるディレクトリの URL への相対パスであることに注意してください。

リポジトリのルートへの相対パス

この URL は、以下の例のように、常に ^/ という文字列で始まります。

^/widgets/foo  common/foo-widget

これは、C:\Working\common\foo-widgethttp://example.com/svn/repos-1/widgets/foo を抽出します。

同じ SVNParentPath (複数のリポジトリを保持する共通ディレクトリ) にある他のリポジトリに、容易に参照できます。例は以下のようになります。

^/../repos-2/hammers/claw  common/claw-hammer

これは、C:\Working\common\claw-hammerhttp://example.com/svn/repos-2/hammers/claw を抽出します。

スキームへの相対パス

// で始まる URL は URL のスキーム部のみをコピーします。これは同じホスト名に対して、ネットワークの場所によって異なるスキームでアクセスしなければならない場合に便利です。例えば、インターネットにあるクライアントは http:// を使用するのに、外部クライアントは svn+ssh:// を使用するということです。以下に例を挙げます。

//example.com/svn/repos-1/widgets/foo  common/foo-widget

これは、C:\Working をチェックアウトするのに使用した方法により、http://example.com/svn/repos-1/widgets/foosvn+ssh://example.com/svn/repos-1/widgets/foo を抽出します。

サーバのホスト名への相対パス

/ で始まる URL は URL のスキーム部とホスト名部をコピーします。以下に例を挙げます。

/svn/repos-1/widgets/foo  common/foo-widget

これは C:\Working\common\foo-widgethttp://example.com/svn/repos-1/widgets/foo を抽出します。しかし、svn+ssh://another.mirror.net/svn/repos-1/project1/trunk というように別のサーバから作業コピーをチェックアウトすると、外部参照は svn+ssh://another.mirror.net/svn/repos-1/widgets/foo を抽出します。

TortoiseSVN が属性をどのように扱うかについての詳細な情報は、プロジェクト設定項 を参照してください。

共通サブプロジェクトへの他のアクセス方法については、共通のサブプロジェクトを含める項 を参照してください。