Xcode で SCM を使ってみる

これからプログラミングを始めようと思ったのだけど、 やっぱりソースコード管理(バージョン管理)をしないといけないだろう。 去年まで作っていたプロジェクトはそこんところ何もしていなかったので、 いざという時に結構苦労したからだ。

Subversion を使って Xcode の SCM を利用する

まずはターミナル (Terminal) で Subversionリポジトリを作らなければならない。 居間と寝室の 2 台のパソコンからリポジトリにアクセスしたかったので、 Time Capsule に接続した USB ハードディスク(Pearl)に作成することにした。

  1. まずは Finder で Pearl にアクセスしてマウントしておく。 ターミナルからは /Volumes/Pearl でアクセスすることができる。

    $ sudo svnadmin create /Volumes/Pearl/SVNRepository

  2. 次に Xcode で SCM リポジトリを構成する (「SCM」>「SCM リポジトリを構成...」)。

    リポジトリを追加

    SCM リポジトリを構成

    1. Xcode 環境設定の SCM で、 左のリストの下の「+」をクリックしてリポジトリを追加する。

    2. 指定した名前と SCM の種類でリポジトリが出来るので、 リポジトリの URL を入力する。 ここではローカルにマウントしたネットワークドライブにあるリポジトリディレクトリなので、 「file://」を先頭に付けてフルパスを指定する。 なお「file:」の次はスラッシュ三つである点に注意。 何となれば「file://」の次に「/Volume/...」が続くからだ。

      URL を入力して別のフィールドにフォーカスを移動すると、 自動的にスキームとパスが補完される。

  3. ディレクトリを作成でエラー

    次に「SCM」>「リポジトリ」でリポジトリにプロジェクトのディレクトリを作成する。

    リポジトリウィンドウで SVN Pearl リポジトリを選択して「ディレクトリを作成」ボタンをクリックする。 しかしなぜかエラーになってしまう。

    エラー:45(Operation not supported)説明:Can't get exclusive lock on file '/Volumes/Pearl/SVNRepository/db/txn-current-lock': Operation not supported

ネットを検索したところ、 どうやら SVN がファイルロックをかけようとするのだが、 ネットワークドライブがロックに対応していないせいらしい。 リソースを提供するサーバが FreeBSD とか Linux 等であれば、 lockd/statd を起動しておくとか、 ネットワークドライブは使わずに svnservessh を使えばいいそうなのだが、 相手が Time Capsule ではどうしようもない。

どうも Subversion ではなくて CVS ならネットワークドライブでもうまくいくらしい。

しかし今更 CVS はないかー。 とも思ったのだがサーバマシンを用意することも出来ないので、 おとなしく CVS を使うことにする。 使ってないノートパソコン (Sony VAIO C1XE とか Hitachi の Chandra とか) もあるにはあるのだが… さすがにサーバ用途には向いていまい。

CVS を使って Xcode の SCM を利用する

  1. Subversion と同様にリポジトリを作る。

    $ cvs -d /Volumes/Pearl/Repository init

  2. 次にバージョン管理したくないファイルを登録する。

    1. リポジトリから管理ファイルディレクトCVSROOT をチェックアウトする。

      $ cvs -d /Volumes/Pearl/Repository co CVSROOT
      cvs checkout: Updating CVSROOT
      U CVSROOT/checkoutlist
      U CVSROOT/commitinfo
      U CVSROOT/config
      U CVSROOT/cvswrappers
      U CVSROOT/loginfo
      U CVSROOT/modules
      U CVSROOT/notify
      U CVSROOT/postadmin
      U CVSROOT/postproxy
      U CVSROOT/posttag
      U CVSROOT/postwatch
      U CVSROOT/preproxy
      U CVSROOT/rcsinfo
      U CVSROOT/taginfo
      U CVSROOT/verifymsg
      $ 
    2. バージョン管理の対象から外すファイルのパターンを CVSROOT/cvsignore に書き出す。

      $ cd CVSROOT
      $ cat <<EOT > cvsignore
      .DS_Store
      ._*
      *.app
      *.build
      *.pbxindex
      *.pbxuser
      *.mode1v3
      build
      EOT
      $ 
    3. cvsignoreリポジトリに追加する。

      $ cvs add cvsignore 
      cvs add: scheduling file `cvsignore' for addition
      cvs add: use `cvs commit' to add this file permanently
      $ cvs commit -m 'cvsignore is modified for Mac OS X development'
      cvs commit: Examining .
      /Volumes/Pearl/Repository/CVSROOT/cvsignore,v  <--  cvsignore
      initial revision: 1.1
      cvs commit: Rebuilding administrative file database
      $ 
    4. 取り出した管理ファイルのコピーを削除する。

      $ cd ..
      $ cvs release -d CVSROOT
      You have [0] altered files in this repository.
      Are you sure you want to release (and delete) directory `CVSROOT': y
      $ ls CVSROOT
      ls: CVSROOT: No such file or directory
      $ 
  3. 次に Xcode で SCM リポジトリを構成する (「SCM」>「SCM リポジトリを構成...」)。

    CVS リポジトリを追加

    SCM リポジトリを構成

    1. Xcode 環境設定の SCM で、 左のリストの下の「+」をクリックしてリポジトリを追加する。

    2. 指定した名前でリポジトリが出来るので、 リポジトリのルートを入力する。 ここではローカルにマウントしたネットワークドライブにあるリポジトリディレクトリなので、 フルパスを指定する。

      パスを入力して別のフィールドにフォーカスを移動すると、 自動的にパスが補完される。

リポジトリに新しいプロジェクトを作る

作成したリポジトリに新しいプロジェクトを追加してみる。

  1. 作成するディレクトリの指定

    作成されたディレクト

    先ず「SCM」>「リポジトリ」でリポジトリにプロジェクトのディレクトリを作成する。

    リポジトリウィンドウで Pearl リポジトリを選択して「ディレクトリを作成」ボタンをクリックする。

  2. ディレクトリをチェックアウト

    作成したディレクトリに新規プロジェクトを作成するため、 ディレクトリをチェックアウトする。

    作成したディレクトリを選択して、 チェックアウトボタンをクリック。

  3. 新規プロジェクト

    上書きするか確認

    作成されたプロジェクト

    「ファイル」>「新規プロジェクト...」を選択してプロジェクトを作る。

    プロジェクトを作る場所はリポジトリディレクトリをチェックアウトした場所。 そのためディレクトリがすでに存在するので置き換えてもいいか確認するダイアログが表示されるので、 置き換えをクリック。 チェックアウトしたディレクトリには CVS の管理用の CVS サブディレクトリがある。 しかし置き換えをクリックしても削除されないので大丈夫。

  4. 後はいつもと同じようにプログラムを作成すれば OK である。

リポジトリに変更を反映する

一通りプログラムが完成したら、 新規に作成したプロジェクト、 ファイルをリポジトリに反映する。

プロジェクトの情報

プロジェクトルートと SCM

  1. 先ずプロジェクトを選択して「ファイル」>「情報を見る」を選択し、 プロジェクトの情報を表示する。

  2. 「ルートと SCM を構成...」をクリックして、 プロジェクトルートと SCM を設定する。 SCM は CVS を選択する。

    選択すると自動的にリポジトリの値が、 推奨のリポジトリに設定される。

    OK ボタンをクリックするとプロジェクト情報ウィンドウに 「SCM」 タブが追加される。

  3. 状況が不明なファイル

    追加マークのついたファイル

    プロジェクトのコミット

    次に、作成したプロジェクトとファイルをリポジトリに追加する。

    「SCM」>「SCMの結果」を選択すると、 新規に作成したプロジェクトとファイルの一覧が表示される。

  4. これらをすべて選択して、 「SCM」>「リポジトリに追加」を選択する。

    すると、 状況が不明(?)だったファイルの状況が追加マーク(A)になる。

    ここではマークがついただけで、 まだ実際には追加されたわけではない。 他にも修正マーク(M)なんてのがつく場合もある。

  5. これらの状況をリポジトリに反映させるには、 変更をコミット(commit)すればよい。

    ここでは「SCM」>「プロジェクト全体をコミット...」を選択する。

  6. リポジトリの情報を再度読み込んだところ

    リポジトリにコミットした状態を確認するには、 「SCM」>「リポジトリ」 でリポジトリウィンドウを表示して、 「再度読み込む」 ボタンをクリックする。

以上が、 リポジトリディレクトリを追加してからプロジェクトを作成し、 それらのファイルをリポジトリに追加する方法である。

逆に、 プロジェクトを作成してから、 それをリポジトリに読み込ませる方法もある。 が、 それはまたの機会に。

2010/3/7 追記:  バージョン管理から除外するファイルを指定する手順を追記。