Xcode5からgithubのレポジトリを使う方法

Xcode5は一つ前のバージョンであるXcode4に比べてソースコードコントロールの操作が大幅に変更されました。
また、デフォルトでgitレポジトリを作成するオプションが選択されているなど、ソースコントロールを前提とした実装になっています。

ソースコントロールの操作も、これまでのFile->Source ControlからOrganizer経由で行う形から、独立したSource Controlというメニューが新設され、そこに機能が集約されており、とても使いやすくなっています。

ただ、Xcodeの作成するgitレポジトリをそのままgithubにpushすると、共同作業に必要のないローカルなプロジェクトファイルもpushされてしまうため、少し注意が必要です。ここでにXcodeでプロジェクトを作成してそれをgihubのレポジトリに登録する方法をみてみましょう。

Xcodeで新規プロジェクトを作成

Xcode起動時のCreate a new Xcode projectを選ぶか、File->New->Project...を選んで新規プロジェクトを作成します。

次にテンプレートを選んでNextボタンを押します。

続けて、Product Name、Organization Name等を記入し、Nextボタンを押します。このあたりは通常のプロジェクト作成と全く同じ手順です。

さて、次が重要なポイントですが、Source ControlのCreate git repository onのチェックボックスが選択されていることを確認します。もし選択されていない場合は、チェックボックスをクリックして選択します。

Createボタンを押すことで、無事ローカルなgitレポジトリで管理されたプロジェクトが作成されます。

プロジェクトが作成されたら、いったんXcodeを終了して、次の作業を行います。

gitレポジトリからローカルなプロジェクトファイルを削除する

本来ならこのままgithubのレポジトリを使用するように設定したいところですが、Xcodeは自動的に共同作業に必要のないローカルユーザー用のプロジェクトファイルも、gitレポジトリに登録してしまっています。

そのため、ここではローカルなプロジェクトファイルをgitレポジトリから削除する作業を行います。

プロジェクトを作成した直後は、

$ find * -type f | sort
ESBeacon.xcodeproj/project.pbxproj  
ESBeacon.xcodeproj/project.xcworkspace/contents.xcworkspacedata  
ESBeacon.xcodeproj/project.xcworkspace/xcuserdata/enamel.xcuserdatad/UserInterfaceState.xcuserstate  
ESBeacon.xcodeproj/xcuserdata/enamel.xcuserdatad/xcschemes/ESBeacon.xcscheme  
ESBeacon.xcodeproj/xcuserdata/enamel.xcuserdatad/xcschemes/xcschememanagement.plist  
ESBeacon/Base.lproj/Main_iPad.storyboard  
ESBeacon/Base.lproj/Main_iPhone.storyboard  
ESBeacon/ESBeacon-Info.plist  
ESBeacon/ESBeacon-Prefix.pch  
ESBeacon/ESBeaconAppDelegate.h  
ESBeacon/ESBeaconAppDelegate.m  
ESBeacon/ESBeaconViewController.h  
ESBeacon/ESBeaconViewController.m  
ESBeacon/Images.xcassets/AppIcon.appiconset/Contents.json  
ESBeacon/Images.xcassets/LaunchImage.launchimage/Contents.json  
ESBeacon/en.lproj/InfoPlist.strings  
ESBeacon/main.m  
ESBeaconTests/ESBeaconTests-Info.plist  
ESBeaconTests/ESBeaconTests.m  
ESBeaconTests/en.lproj/InfoPlist.strings  

このようなファイルが作成されていると思います。

git ls-filesと実行すると、gitレポジトリで管理されているファイルの一覧が表示されます。

$ git ls-files | sort
ESBeacon.xcodeproj/project.pbxproj  
ESBeacon.xcodeproj/project.xcworkspace/contents.xcworkspacedata  
ESBeacon.xcodeproj/xcuserdata/enamel.xcuserdatad/xcschemes/ESBeacon.xcscheme  
ESBeacon.xcodeproj/xcuserdata/enamel.xcuserdatad/xcschemes/xcschememanagement.plist  
ESBeacon/Base.lproj/Main_iPad.storyboard  
ESBeacon/Base.lproj/Main_iPhone.storyboard  
ESBeacon/ESBeacon-Info.plist  
ESBeacon/ESBeacon-Prefix.pch  
ESBeacon/ESBeaconAppDelegate.h  
ESBeacon/ESBeaconAppDelegate.m  
ESBeacon/ESBeaconViewController.h  
ESBeacon/ESBeaconViewController.m  
ESBeacon/Images.xcassets/AppIcon.appiconset/Contents.json  
ESBeacon/Images.xcassets/LaunchImage.launchimage/Contents.json  
ESBeacon/en.lproj/InfoPlist.strings  
ESBeacon/main.m  
ESBeaconTests/ESBeaconTests-Info.plist  
ESBeaconTests/ESBeaconTests.m  
ESBeaconTests/en.lproj/InfoPlist.strings  

比較しやすいようにsortをかけています。作成されたファイルのうち、UserInterfaceState.xcuserstateを除いて全てのファイルがgitレポジトリに登録されていることが分かります。

このうちローカルでのみ必要なファイルをgitの管理からはずす.gitignoreをこちらの記事を参考に、

[Git]Xcode プロジェクトをうまく .gitignore する

Top directoryに.gitignoreというファイル名で作成します。

##
## Xcode projects .gitignore files.
##
.DS_Store

##
## Xcode Project
##
**/*.xcodeproj/*
!**/*.xcodeproj/project.pbxproj
!**/*.xcodeproj/default.*

##
## Xcode Workspace
##
*.xcworkspace/*
!*.xcworkspace/contents.xcworkspacedata

さて、ここからがすこし手間ですが、無視したいファイルはすでにgitの管理下にありますので、それを再度管理から外す作業が必要です。

.gitignoreを作成後、git ls-filesをexclude-fromオプション付きで実行すると、gitignoreで無視されるファイルが表示されますので、そのファイルをgitレポジトリから削除します。実際には以下のようなShell scriptを用意して実行するのが簡単だと思います。

## Add .gitignore
git add .gitignore  
git commit -m "Add .gitignore"

## Remove local project files
echo "Removing local project files"  
LIST=`git ls-files -i --exclude-from=.gitignore`

for i in $LIST  
do  
echo $i  
git rm -f --cached $i  
done

## Commit local removal.
git commit -m "Remove local project files from git"

.gitignoreファイルの作成も含めて、この作業を自動化したShell scriptを、

github: EnamelSytems/Xcode-scripts

xcode-remove-local-project-from-git.shという名前で置きましたので興味のあるかたはお使いください。

続きます