2010-07-01

Xcode の SCM 機能を使って SVN ( Subversion ) 管理

Xcode プロジェクトのファイル一式を、なるべく Xcode の SCM 機能の GUI を使って、バージョン管理システム SVN (Subversion) で管理する方法です。
世の中では、より新しいバージョン管理システムである Git に移行しつつありますが( iPhone デベロッパーズ クックブックで有名なエリカ様も...)、空気を読まずに SVN を取り上げます。

目次は次の通り。
  1. Xcode プロジェクトを SVN リポジトリに初コミットする
  2. コミット済の Xcode プロジェクトをチェックアウトする
  3. SVN と連携した1タスクあたりのワークフロー
状況によって、次のように読み進めてください。
  • SVN リポジトリ上に、Xcode プロジェクトを新しく追加する場合:
    • 1. と 3. を読んでください
  • SVN リポジトリ上に、Xcode プロジェクトが既にある場合(既存プロジェクトに途中から参加):
    • 2. と 3. を読んでください
また、前提条件は次の通り。


1. Xcode プロジェクトを SVN リポジトリに初コミットする

SVN リポジトリ上に、Xcode プロジェクトがまだない人は、ここから開始してください。

1.1 Xcode に SVN リポジトリの登録

Xcode 上で初めて SVN を扱う場合、 Xcode に対して SVN のための設定をする必要があります。

Xcode を起動し、 Xcode メニュー > 「SCM」 > 「SCM リポジトリを構成...」をクリックします。

「"Xcode"環境設定」画面が表示されます。
画面左下の「+」ボタンをクリックします。
「新しいリポジトリの名前とSCMシステムを選択してください:」画面が表示されます。
次の情報を入力します。
  • 「名前」: 適当な文字列を入力します
  • 「SCMシステム」:「Subversion」を選択します
「OK」ボタンをクリックします。

 「"Xcode"環境設定」画面に、先ほど入力した「名前」と共に、新しいリポジトリの設定画面が表示されます。
次の情報を入力します。
  • 「名前」:先ほど入力した「名前」が既に入力されています
  • 「URL」:そのままにします。他の入力欄から自動的に生成されます
  • 「スキーム」:http や httpsなどを入力します
  • 「ホスト」:ホスト名を入力します
  • 「パス」:ホスト名の下に何かパスがあれば入力します
  • 「ポート」:基本空白のままにします。SVNサーバのポートがデフォルト(3690)以外であれば入力します
  • 「ユーザ」:SVNサーバに接続する際のユーザ名を入力します
  • 「パスワード」:SVNサーバに接続する際のパスワードを入力します
「パスワード」入力欄の下にステータスが表示されています。「認証されました」と表示されれば、登録成功です。「OK」ボタンをクリックして画面を閉じます。

1.2. SVN リポジトリに Xcode プロジェクトを追加

1.2.1 リポジトリ上で Xcode プロジェクトディレクトリをおく予定の場所に、空のディレクトリをコミット

Xcode メニュー > 「SCM」 > 「リポジトリ」をクリックします。

「リポジトリ」の画面が表示されます。
Xcode プロジェクトのファイル一式を置く予定の場所で「ディレクトリを作成」ボタンをクリックしてディレクトリを作成します。ディレクトリ名は Xcode プロジェクト名と同じにします。そのディレクトリ下に、同様に「trunk」 「branches」「tags」ディレクトリも作成します(基本的な SVN のディレクトリ・レイアウト)。
最終的に、「trunk」ディレクトリ(例:<リポジトリルート>\< Xcode プロジェクト名>\trunk\ )の下に、.xcodeprojファイルなどのファイル一式を置くことになります。

1.2.2 リポジトリ上の空の Xcode プロジェクトディレクトリをチェックアウトして、ローカルの Xcode プロジェクトディレクトリと紐付ける

「リポジトリ」の画面上の「trunk」ディレクトリを選択した状態で、「チェックアウト」ボタンをクリックします。

「チェックアウトしたディレクトリの保存先を選択してください。」の画面が表示されます。
名前を「trunk」から Xcode プロジェクト名に変更します。チェックアウト先のディレクトリの親ディレクトリを選択して、「チェックアウト」ボタンをクリックします。
これにより、バージョン管理したい Xcode プロジェクトのトップディレクトリに上書きされます。

※注意:
ここで、ターミナル上で 「ls -a」コマンドを実行すると、 Xcode プロジェクトのトップディレクトリ内に「 .svn 」ディレクトリが追加されていることを確認できるはずです。このディレクトリは、 SVN のメタデータであり、 あるディレクトリ内のファイルが SVN リポジトリと紐づくとそのディレクトリ内に自動生成される隠しファイルです。
何らかの理由で、既にローカルの Xcode プロジェクトのトップディレクトリ内に「 .svn 」ディレクトリが存在している場合、チェックアウトに失敗してしまいます。その場合は、ターミナルを起動し、
と実行して、 Xcode プロジェクトのトップディレクトリ以下全てのディレクトリ内の SVN メタデータを削除してから、再度チェックアウトしてみてください。

1.2.3 バージョン管理するファイルを選択してコミット

ここからターミナル上での作業になります。(本当は Xcode GUI だけで完結させたかったのですが、GUIから svn propset svn:ignore をする方法がなさそうなので、このような方法を取っています)

最初にすべてをバージョン管理対象にします。(2行目)

不要なファイルを取り除き、バージョン管理対象から外します(「 Example.xcodeproj 」の文字列は、実際の Xcode プロジェクト名 .xcodeproj に置き換えてください)。(3~9行目)

ローカルの変更をリポジトリにコミットします。(10行目)

1.3 Xcode プロジェクトに SVN リポジトリを設定

Xcode に対する SVN 設定とは別に、 Xcode プロジェクト各々においても、どのリポジトリを利用するかの設定をする必要があります。

Xcode プロジェクトを開き、Xcode メニュー > 「SCM」 > 「このプロジェクトの SCM を構成...」をクリックします。

「"プロジェクト"< Xcode プロジェクト名>""の情報」画面が表示されます。
画面上部にある「一般」タブを選択して、画面内右上にある「ルートと SCM を構成...」ボタンをクリックします。

「プロジェクトルートと SCM 」画面が表示されます。右上ドロップダウンリストは「 Subversion 」を選択し、「<プロジェクト・ファイル・ディレクトリ>」のリポジトリは「 1.1 Xcode に SVN リポジトリの登録」で登録したリポジトリ名を選択します。
「 OK 」ボタンをクリックします。

Xcode 画面の左上にある「グループとファイル」と表記のあるあたりを右クリックして表示されるメニューから、「 SCM 」にチェックを入れます。
これにより、「グループとファイル」の左部に新しい領域が追加されます。この領域には、次のような記号が表示されるようになります:
  • 空白:リポジトリ上のファイルとローカルのファイルが一致しているという意味
  • 「 U 」: Updated の略。リポジトリ上のファイルが更新されているという意味
  • 「 M 」: Modified の略。ローカルのファイルが変更されているという意味
  • 「 ? 」:ローカルのファイルがリポジトリに未登録であるという意味
  • 「 A 」: Added の略。「 ? 」のファイルをリポジトリ登録すると、この表記になります。追加ファイルという意味
  • 「 C 」: Conflict の略。リポジトリ上のファイルの更新内容とローカルのファイルの変更内容がコンフリクト(衝突)しているという意味
(これらは、ターミナル上で svn status と実行したときに表示される記号と同じものです)

Xcode プロジェクトを SVC リポジトリに初コミットする作業は以上です。「 2. コミット済の Xcode プロジェクトをチェックアウトする 」の作業は不要ですので、飛ばして「 3. SVN と連携した1タスクあたりのワークフロー」 に進んでください。


2. コミット済の Xcode プロジェクトをチェックアウトする

SVN リポジトリ上に、Xcode プロジェクトが既にある人は、ここから開始してください。

2.1 Xcode に SVN リポジトリの登録

「 1.1 Xcode に SVN リポジトリの登録」と同じ。

2.2 SVN リポジトリから Xcode プロジェクトをチェックアウト

Xcode メニュー > 「SCM」 > 「リポジトリ」をクリックします。

リポジトリ上の Xcode プロジェクトディレクトリ下の「 trunk 」ディレクトリを選択します。「名前」を Xcode プロジェクト名に変更します。「チェックアウト」ボタンをクリックします。





2.3 Xcode プロジェクトに SVN リポジトリを設定

「 1.3 Xcode プロジェクトに SVN リポジトリを設定」と同じ。

コミット済の Xcode プロジェクトをチェックアウトするところからプロジェクトに参加する人の開発準備作業は以上です。


3. SVN と連携した1タスクあたりのワークフロー

ここまでで、ローカルには SVN リポジトリとの紐付けが完了した Xcode プロジェクトが用意されました。
ここでは、 作業開始してから SVN リポジトリと同期を取り、 SVN と連携をとりながら 一つのタスク(機能追加や修正)を完了しコミットするまでの手順を説明します。

3.1 作業を開始したらまずは更新確認

Xcode メニュー > 「SCM」 > 「リポジトリ全体を更新」をクリックします。
その下の「アップデート」と言葉が似ていますが、全く違うコマンドなので注意してください。
「更新」ではリポジトリ上のファイルやローカルのファイル自体は何も変更されません。リポジトリと比較してローカルのファイルの相違を確認し、その結果を Xcode 画面左部の SCM 欄などに反映するためのコマンドです。
対して「アップデート」は、ローカルのファイルを上書きします。

3.2 リポジトリとローカルの相違を確認してアップデート

リポジトリ上のファイルが更新されていると、 Xcode 画面左部の SCM 欄に、 「 U 」と表示されます。

「 U 」表示のあるファイルを選択してから、Xcode メニュー > 「SCM」 > 「比較」 > 「最新」をクリックします。



リポジトリ上のファイルとローカルのファイルを左右に並べて比較する画面が表示されます。

※注意:
  • この比較画面だけで完結してマージ作業できたらいいのですが、たぶんできません( eclipse みたいに、左右のコピーも直接編集も可能なマージ画面を期待していたのですが。何かうまい方法があれば教えてください)
  • 当該ファイルを直接選択後右クリックして表示されるメニューにある「比較」は、厳密には最新との比較ではありません。チェックアウトあるいは最後にアップデートしたときのバージョンのファイルとの比較です。最新と比較したい場合は、前記の方法を行ってください。
「 U 」表示のあるファイルを直接選択後右クリックして表示されるメニュー > 「アップデート」をクリックすると、リポジトリの更新がローカルのファイルに上書きされます。念のため、ここでもう一度Xcode メニュー > 「SCM」 > 「リポジトリ全体を更新」をクリックしてアップデート確認をしておきます。
基本的にタスクに取りかかる前に、「 U 」表示はなくすようにします。ローカルの変更内容とリポジトリの更新内容がコンフリクトすると、マージが面倒なことになります( コンフリクトしたら、「 3.4 リポジトリとローカルの相違を確認してマージ」の手順で解消します)。

3.3 タスク消化

機能追加や修正など、タスクを消化します。

3.4 リポジトリとローカルの相違を確認してマージ

「 U 」表示のあるファイルを選択して右クリックして表示されるメニュー上に、「アップデート」がない場合、リポジトリ上のファイルの更新内容と、ローカルファイルの変更内容がコンフリクトしています。

 コンフリクトすると、「変更をコミット...」をクリックしても、「 SCM エラー」でコミットできなくなります。
この場合、選択肢としては
(ア)ローカルの変更を破棄する
(イ)マージする
の二つがあります。

(ア)の場合、当該ファイルを選択して右クリックして表示されるメニュー >「変更を破棄...」をクリックします。

(イ)の場合、当該ファイルを選択 > Xcode メニューの「 SCM 」 > 「アップデート」 > 「リビジョン」 をクリックします。

マージをしたいリビジョン(基本的には最新のもの)を選択して、「アップデート」をクリックします。

 ソースコード上に、ローカルの変更内容とリポジトリ上の更新内容が併記されます。

 手作業でマージします。ファイルを保存すると、「 U 」表示が「 C 」表示に変化します。

 当該ファイルを右クリックして表示されるメニュー > 「解決済み」をクリックします。「 C 」表示が「 M 」表示に変化します。







3.5 アップデート表示がなくなったらコミット

Xcode 画面左部の SCM項目に、 「 ? 」が表示されている場合、そのファイルを選択してから右クリックし、「リポジトリに追加」をクリックすることで、 SVN リポジトリに追加登録されます。それにより、「 ? 」表示は「 A 」表示に切り替わります。

「 M 」か「 A 」表示のファイルのみ、コミットできます。当該ファイルを選択してから右クリックし、「コミット」をクリックすることでコミット完了します。






以上です。お疲れさまでした。 

参考:

1 件のコメント:

recognize さんのコメント...

Xcode4.2の記事を期待しています。
宜しくお願いいたします。