XcodeでGitを適切に使用する方法


94

私はしばらくiPhone開発者でしたが、最近はワークフローにgitを組み込んでいます。これまでのワークフローでは、http: //shanesbrain.net/2008/7/9/using-xcode-with-gitにあるgit設定を使用しました。

これらの設定はgitに* .pbxprojをマージから除外するように指示しますか?これを行う本当の理由はありますか?たとえば、プロジェクトにファイルを追加してオリジンにプッシュすると、他の開発者はプルしたときにそのファイルがxcodeプロジェクトに追加されません。その後、そのうちの1つがリリースをビルドする場合、このファイルは含まれない可能性があります。gitにプロジェクトファイルのマージを処理させるだけではいけませんか?このファイルをマージする必要があるのはなぜですか。また、ファイルがプロジェクトに追加されたときに状況を適切に処理する方法はありますか。


9
私はXCodeを操作しませんが、*。pbxprojファイルがVisual Studioの* .csprojファイル(ファイルのリストの一部)のようなものである場合、この設定は私にはかなり馬鹿げているように見えます。2人がプロジェクトにファイルを追加し、最善の解決策はすべてを台無しにすることだと思ったとき、誰かがマージの競合にうんざりしているように思えます...
R. Martinho Fernandes

XCodeの問題(Visual Studioについては不明)は、.pbxprojファイルがほとんど人間が読める形式ではないため、手動で競合を解決しても意味がありません。
トム

7
* .pbxprojファイルは実際にはかなり構造化されており、ブロックの終了セグメントと開始セグメントの間に長いストレッチがあるだけです。節約の恩恵は、ファイルが非常に適切に配置された改行を持っているため、行を変更するだけでファイルをめちゃくちゃにすることは難しく、自動マージは一般的に非常にうまく機能します。これは、マージブロックが一般的に理解しやすいことも意味します。一方の側にいくつかのファイルセットが追加され、もう一方の側に異なるファイルセットが追加されているのがわかります。
Kendall Helmstetter Gelner、2010

回答:


136

私は、SDKのリリース以来、iPhoneアプリケーションにフルタイムで取り組んできました。そのほとんどの時間は、複数の開発者がいるチームでの作業に費やされていました。

真実は、その.pbxprojファイルのマージを禁止するほうが、役立つよりも害が大きいということです。あなたが言うように、他の人がそのファイルを取得しない限り、あなたがファイルを追加するとき、彼らは彼らのプロジェクトにもそれを追加しなければなりません-どんなサイズのアプリケーションでも、それは面倒で、それはあなたのソースコード管理の大きな利点も奪いますgitだけでは、以前の完全なプロジェクト状態に戻すことはできません。

.pbxprojファイルは、単なるプロパティリストです(XMLに似ています)。経験上、2人が同時にファイルを追加した場合に発生するのは、マージの競合のみです。マージの競合の99%での解決策は、マージの両側を維持することです。gitの場合、少なくとも>>>>、<<<<、====の行を削除するだけです。実際、これは非常に一般的なので、gitからマージ状態の.pbxprojファイルを修正するための簡単なシェルスクリプトを作成しました。これをプロジェクトディレクトリ(クラスレベル)内から実行します。

#!/bin/sh

    projectfile=`find -d . -name 'project.pbxproj'`
    projectdir=`echo *.xcodeproj`
    projectfile="${projectdir}/project.pbxproj"
    tempfile="${projectdir}/project.pbxproj.out"
    savefile="${projectdir}/project.pbxproj.mergesave"

    cat $projectfile | grep -v "<<<<<<< HEAD" | grep -v "=======" | grep -v "^>>>>>>> " > $tempfile
    cp $projectfile $savefile
    mv $tempfile $projectfile

失敗した場合の最悪のケース(XCodeにプロジェクトのロードを要求し、ロードに失敗した場合)は、.pbxprojファイルを削除し、gitからマスターをチェックアウトして、ファイルを再度追加するだけです。しかし、このスクリプトで何ヶ月も使用したことがありませんでした。iPhoneアプリケーションで他の何人かの開発者とフルタイムで作業していました。

スクリプトの代わりに使用できる別のオプション(以下のコメントで指摘)は、この行を.gitattributesファイルに追加することです。

*.pbxproj text -crlf -diff -merge=union

その後、gitは常に.pbxprojectファイルのマージの両側を処理します。追加の作業を行わずに提供したスクリプトと同じ効果があります。

最後に、ここに私の完全な.gitignoreファイルを示します。ここには、不要なものがいくつかあるので無視するように設定しているものを示しています。私の場合、実際にはemacsの残りとビルドディレクトリ全体だけです。

# xcode noise
build/*
*.pbxuser
*.mode1v3
*~

# old skool
.svn

# osx noise
.DS_Store
profile

3
xcodeプロジェクトに.gitattributesファイルを使用しますか?そして、あなたの洞察に感謝します。将来、pbxprojファイルをマージするほうがはるかに簡単になると思います。
rickharrison、2010

1
今まではそうではありませんでしたが、そのいくつかの面は興味深いように見えますが、私が一緒に働いた人々はgitの上級ユーザーではないため、高度な機能の推奨は強くありません。
Kendall Helmstetter Gelner、2010

1
「.pbxprojファイルは単なるJSONです(XMLと同様)。」実際、これはOpenStep形式のプロパティリストです。基本的な考え方はJSONと同じですが、構文はいくつかの点で異なります。
Peter Hosey、2010

1
もうしようとするもの-集合マージ=組合:stackoverflow.com/questions/2729109/...
ケンドールHelmstetter Gelner

1
これらの特別な行を削除するスクリプトを実行する代わりに、@ KendallHelmstetterGelnerに同意します。unionスイッチで.gitattributeを更新できます*.pbxproj text/plain -crlf -diff -merge union
Besi

9

これは、Xcode 4.6およびGit 1.7.5で動作します。

これで.gitattributesファイルを追加してコミットします:

*.pbxproj binary merge=union

私はこれを別のチームメンバーでテストしましたが、うまくいきました。

次から取得http : //robots.thoughtbot.com/post/33796217972/xcode-and-git-bridging-the-gap


Merge = unionは適切ですが、mergpbxツールが受け入れられる答えになるはずです。
Alper

8

率直に言って、既存の答えは誤解を招くものです。

ファイルを削除したり名前を変更したりしない場合はmerge=union、異なるコミットの違いを直接組み合わせるだけの方法を使用することをお勧めします。

ただし、現実の世界では、ファイルを削除したり名前を変更したりする必要がある場合があります。これらの状況では、変更を加えずに差分をマージすると多くの問題が発生します。これらの問題は通常、「ワークスペースの整合性-プロジェクトを読み込めませんでした」という問題につながり、プロジェクトを実行できなくなります。

私がこれまでに得た最良の解決策:

1)プロジェクトを適切に設計し、最初に必要なすべてのファイルを追加するので、を変更する必要はほとんどありませんproject.pbxproj

2)機能を小さくします。ブランチであまり多くのことをしないでください。

3)何らかの理由で、ファイル構造を変更してで競合が発生するproject.pbxproj場合は、お好みのテキストエディタを使用して手動で解決してください。タスクを小さくすると、競合は簡単に解決できる場合があります。


3

短い答えは、その行をに含め.gitattributesなくても、.pbxprojの2つの変更されたバージョンを簡単にマージできない可能性があるということです。gitはそれをバイナリとして扱う方が良いです。

詳細はこちらをご覧ください:Gitとpbxproj

更新: git bookはまだこの回答に同意していますが、私は同意しません。私は.pbxproj他の非バイナリソースファイルと同じようにバージョン管理しています。


コミットフィルターを設定して、ファイルをsimplejsonインデックスに送信するか、そのような気の利いたものをインデックスに送信できるように思えます。それでも動作する保証はありません。
2010

1
JSON形式のファイルではありません。よく似ていますが、細部に多くの違いがあります。
eonil

JSONはgit bookに記載されていますが、間違っているようです。git-scm.com/book/ch7-2.html
huggie

1
OK。.pbxprojファイルは実際には古いスタイルのNeXT / Cocoa PListファイルであり、JSONよりもはるかに早く定義されており、現在Appleでは非推奨となっています。(しかし、彼らはまだいくつかの場所でそれを使用しています)本のファイルについての言及は完全に間違っています。あなたが明示的に言及したため、私は反対票を削除しました。
eonil 2013年

2

XCodeプロジェクトファイルのマージ競合を処理できるPythonスクリプトを作成しました。

試してみたい場合は、https//github.com/simonwagner/mergepbxで確認できます。

マージドライバーとしてインストールする必要があるため、プロジェクトファイルでマージの競合が発生すると自動的に呼び出されます(README.mdでその方法がわかります)。

プロジェクトファイルのセマンティクスを理解しmerge=unionているmergepbxため、使用するよりもはるかにうまく機能するため、競合が正しく解決されます。

ただし、プロジェクトはまだアルファ版です。そこにあるすべてのプロジェクトファイルを理解することを期待しないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.