Xcodeのプロジェクトファイル(pbxproj)がコンフリクトしまくるのをなんとかしたい!
2014/02/09 追記
コメントのところでやり取りしているようにmergepbxの作者さんから連絡があって、この記事で書いた問題が修正されました!
今現在は merge=mergepbx
がいい感じになってきているのでそっちがオススメです。
複数人でプログラミングしているとpbxprojがやたらとコンフリクトする
例えば、
- Aさんが
AALabel.m
をプロジェクトに追加して - Bさんが
BBLabel.m
をプロジェクトに追加して
とただそれだけなのにマージのときにコンフリクトするpbxproj
さん。。。
ただそれぞれファイルを追加だけのことでコンフリクトするなんて…
どうにかならんもんかいとTwitterでつぶやいたところ、 @azu_re さんから有り難い教えが!
@tokorom gitはファイル別にマージ方法を指定できるので、mergepbxみたいなのをpbxprojのマージに使うようにするぐらいですかねー(まだαですが)
https://t.co/VxXm0fcJMb
— azu (@azu_re) February 4, 2014
mergepbxを試してみる
まだα版ということだがせっかくなので試してみた。基本的には
https://github.com/simonwagner/mergepbx
のREADMEどおりにインストール&設定するだけ。
cloneして
$ ./build.py
すると、同ディレクトリに mergepbx
というファイルができる。それをPATHの通った場所に設置する。
2014/02/09 追記
(もしくは自分でビルドしなくても https://github.com/simonwagner/mergepbx/releases から最新版をダウンロードすることも可能)
~/.gitconfig
に以下の設定を追加する
[merge "mergepbx"]
name = XCode project files merger
driver = mergepbx %O %A %B
なお、
LANG=
ってところはREADMEには書かれていないのですが、ぼくの手元だと…
と日本語まわりでfailedになったので加えました。
2014/02/09 追記
mergepbxの最新版ではLANG=を指定しなくても問題が発生しなくなりました。
次に、.gitattributes
で
*.pbxproj merge=mergepbx
と pbxproj
のときはマージに mergepbx
を使うように設定を追加という手順です。
mergepbxの結果
ストーリーとしては、
test1
ブランチで 適当なファイルを1つ追加してコミットtest2
ブランチで 別の適当なファイルを1つ追加してコミットtest1
ブランチでgit merge test2
として、pbxprojが自動マージされるかどうかという確認をしたのですが、その結果、
…
と残念ながらうまく自動マージされませんでした。。。
どういうパターンで成功するのかは分かりませんがまだ実用的ではないかんじです。
ただ、READMEの次の項に、 *.pbxproj merge=union
が使えるんだったらそれもいいかもよという記述が…
2014/02/09 追記
mergepbxの最新版ではこのケースがうまく自動マージされるようになりました。cool :)
まとめ
ということで、今のところ merge=union
を使うのが良さそう。
100%うまくいくわけではないけど、一番多く発生する両方で追加するパターンは自動マージされるようになるため、対応コストは確実に低くなると予想しています。
2014/02/09 追記
mergepbxの最新版(0.5以降)を使いましょう!
(まだ少し検証した程度なのでしばらく使ってみます)