project.pbxproj のコンフリクトを解決するために mergepbx を利用する

複数名で iOS のプロジェクトを弄ると project.pbxproj ファイルが頻繁にコンフリクトを起こすのでストレスフルである。このファイルを自動でマージしてくれるツール mergepbx が存在するので、これを導入して精神の安寧を得ようと図る。このツールリポジトリを使うメンバー全員が導入する必要はなく、自分だけが導入することもできるので、導入障壁はわりかし低い。

公式サイト

導入は以下の手順で行う。

$ git clone https://github.com/simonwagner/mergepbx
$ cd mergepbx/
$ ./build.py
$ sudo cp mergepbx /usr/local/bin/
$ vi ~/.gitconfig
[merge "mergepbx"]
    name = XCode project files merger
    driver = /usr/local/bin/mergepbx %O %A %B

driver の設定でフルパスを指定しているのは、公式ページにあるようにコマンド名のみを指定する方法では SourceTree から mergepbx を起動できなかったからである。mergepbx: command not found と表示された。CLIgit からだとコマンド名のみの設定のままで mergepbx を起動できるので原因は不明。おそらく PATH まわりだと思うけれど。

git リポジトリのルートに .gitattributes を作成して下記を追加。もしくはこの設定をリポジトリで共有したくない場合は .git/info/attributes に記述。

*.pbxproj merge=mergepbx

以上の設定を行ったのちに SourceTree を用いて merge したところ、下記のような出力を得た。ちゃんと merge されているようだ。

git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree merge --no-commit feature/Testmerge2
Automatic merge went well; stopped before committing as requested
Auto-merging proj.ios_mac/nmd.xcodeproj/project.pbxproj
Completed successfully