ionicのplatforms以下のXcodeプロジェクトをgit submoduleで管理する

## やりたいこと
`ionic cordova build ios` で `platforms` 以下に出力されるXcodeのプロジェクトをgit管理したい

## 目的
Xcodeのプロジェクト自身に設定された情報（Capabilitiesなど）をバージョン管理したいため

## 環境
```bash
$ ionic info

cli packages: (/usr/local/lib/node_modules)

    @ionic/cli-utils  : 1.19.2
    ionic (Ionic CLI) : 3.20.0

global packages:

    cordova (Cordova CLI) : 8.0.0

local packages:

    @ionic/app-scripts : 3.1.11
    Cordova Platforms  : CordovaLib cordova ios 4.5.5 ios_test ios_test.xcodeproj ios_test.xcworkspace platform_www www
    Ionic Framework    : ionic-angular 3.9.2

System:

    ios-deploy : 1.9.0
    ios-sim    : 5.0.12
    Node       : v6.4.0
    npm        : 3.10.3
    OS         : macOS Sierra
    Xcode      : Xcode 9.2 Build version 9C40b
```

## platforms 以下のXcodeプロジェクトは git submodule で独立したリポジトリとして管理する
ionic のルート直下にあるデフォルトの `.gitignore` では `platforms` 以下は無視されている
`platforms` 以下を対象にするため、`# platforms/` としたいところだが、そのままだと `platforms` 以下の `node_modules` や `plugins` まで対象外になってしまう

ionic のルート直下にある**デフォルトの `.gitignore` を直接編集することも考えたが、以下の理由で止めた**

- `platforms` 以下にも `node_modules` ディレクトリがあるが、`package.json` がないため無視されてしまうとクローン後に再現できない
- かといってルート直下の `.gitignore` に書かれている、「ルート以下の特定の名前を持つ全ディレクトリを無視する設定」を、`platforms` 以下だけ追跡するようにするのは難しそう[^1]
- `ionic cordova platform add ios` のときにしか生成されない、iOSでしか使われないモジュールが含まれているよう

思いもよらないファイルを無視してしまってエラーが出るのも面倒なので、`node_modules` 以下も含めて git 管理してしまうことにする

## サブモジュール作成手順
1. ionic プロジェクトのルートで `git init`
1. platforms/ios で `git init` し、サブモジュール化

```bash
$ ionic start ionic_test blank
$ cd ionic_test/
$ ionic cordova platform add ios
$ ionic cordova run ios // エミュレータで動作確認

// ionic_test/platforms/ios で git init
$ cd platforms/ios
$ git init
// リモートリポジトリを設定してプッシュ（この例では、リモートリポジトリは https://bitbucket.org/ionic_test_ios.git）

$ cd ../
$ rm -rf ios

// ionic_test/platforms
$ git submodule add -f https://bitbucket.org/ionic_test_ios.git ios
// サブモジュールを設定すると、カレントディレクトリにクローンされる
```

あとはサブモジュールにコミットすると、もとの git の方にもそのコミットIDが自動的に反映されるので、もとの git の方でそのコミットIDをコミットする

## 実際に clone してビルドしてみる
```bash
$ git clone https://bitbucket.org/ionic_test.git
Cloning into 'ionic_test'...
remote: Counting objects: 101, done.
remote: Compressing objects: 100% (93/93), done.
remote: Total 101 (delta 7), reused 0 (delta 0)
Receiving objects: 100% (101/101), 1.32 MiB | 295.00 KiB/s, done.
Resolving deltas: 100% (7/7), done.
Checking connectivity... done.

$ cd ionic_test/
$ git submodule
-0b12e433d5fa9475180d9a6ef29f2db0ffa00648 platforms/ios

$ git submodule init
Submodule 'platforms/ios' (https://bitbucket.org/ionic_test_ios.git) registered for path 'platforms/ios'

$ git submodule update
Cloning into 'platforms/ios'...
remote: Counting objects: 849, done.
remote: Compressing objects: 100% (635/635), done.
remote: Total 849 (delta 147), reused 820 (delta 138)
Receiving objects: 100% (849/849), 2.97 MiB | 549.00 KiB/s, done.
Resolving deltas: 100% (147/147), done.
Checking connectivity... done.
Submodule path 'platforms/ios': checked out '0b12e433d5fa9475180d9a6ef29f2db0ffa00648'

$ ionic cordova build ios
...
** BUILD SUCCEEDED **

[ERROR] An error occurred while running cordova build ios (exit code 1).

// エラーの理由が分からないが、もう一度ビルドすれば正常にビルドされる
$ ionic cordova build ios
```

## まとめ
`.gitignore` が上手く書けなかったのでサブモジュールを使いましたが、リポジトリが分かれてしまうのでできればひとつのリポジトリで管理したかったです
`.gitignore` での上手な書き方があれば教えてください！

## 参考
- [Git submoduleの押さえておきたい理解ポイントのまとめ - Qiita](https://qiita.com/kinpira/items/3309eb2e5a9a422199e9)
- [[Git] .gitignoreの仕様詳解 - Qiita](https://qiita.com/anqooqie/items/110957797b3d5280c44f)

[^1]: 「ただし、一度記述した「ディレクトリの除外」を、跡から！で追跡しなおす設定は認められません。」(http://www-creators.com/archives/1662#gitignore-5)