私たちのチームには2人のメンバーがいます。 XcodeのSCM(SVNを使用)を使用して、ソースコードファイルを管理します。
すべてのファイルをXcodeプロジェクトに追加します。彼はSVNサーバーにコミットしています。更新すると、Xcodeはproject.pbxproj
ファイルに競合があることを検出します。次に、[Xcode
を終了]を選択し、手動で競合をマージします。次に、project.pbxproj
の編集を開始し、変更をマージします。実際、Xcodeがファイルを管理する方法がわかりません。project.pbxproj
ファイルにないテキストを追加するだけです。終了すると、プロジェクトを開くことができません。 project.pbxproj
ファイルは手動で編集できないためだと思います。
だから、この問題を見つけたときにproject.pbxprojファイルに競合があることを知りたいのですが、どのように解決するのですか?
ありがとうございました!
残念ながら、1回のチェックアウトで手動で変更を行ってから、新しく「マージされた」プロジェクトをチェックインする以外にできることはあまりありません。
私はgitを使用していますが、同じ問題が発生します。2人でファイルを追加すると、マージの競合が発生します。
通常、編集は非常に簡単です。テキストエディタでproject.pbxprojファイルに移動し、マージの競合セクションを探します。通常、次のようなマークが付けられます。
>>>>>>>
Stuff 1
======
Stuff 2
<<<<<<<<
Xcodeプロジェクトのマージの競合の99%のケースでは、マージの両側を受け入れるだけです(2人が異なるファイルを追加したため)-マージマーカーを削除するだけで、上記の場合は次のようになります。
Stuff 1
Stuff 2
私が言ったように、これはほとんどの場合にうまく機能します。完了してもXcodeがプロジェクトファイルを読み取らない場合は、最新のマージされていないバージョンを使用して、ファイルを手動で再度追加してください。
このソリューションはgit専用ですが、.gitattributes
ファイルをプロジェクトに追加し、そのファイル内に次の行を追加します。
*.pbxproj merge=union
これにより、gitにマージの両側を保持するように指示します。
マージの競合を手動で解決するには、競合する各アイテムのUUID
を確認します。
例:
<<<<<<< HEAD
6B01C4B72008E70000A19171 /* ExistingFile.Swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B01C4B62008E70000A19171 /* ExistingFile.Swift */; };
3F01C4B72008E70000889299 /* NewFileA.Swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F01C4B72008E70000889299 /* NewFileA.Swift */; };
=======
6B01C4B72008E70000A19171 /* ExistingFile.Swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B01C4B62008E70000A19171 /* ExistingFile.Swift */; };
4DF01C4B72008E70000882ED /* NewFileB.Swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF01C4B72008E70000882ED /* NewFileB.Swift */; };
>>>>>>> branch_to_merge
各UUIDを確認します。
ExistingFile.Swift
NewFileA.Swift
およびNewFileB.Swift
のままにしてください。project.pbxproj
ファイル全体で1つのオカレンスしか見つけることができない場合、それはアーティファクトであり、削除しても安全であると思います。結果は次のようになります。
6B01C4B72008E70000A19171 /* ExistingFile.Swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B01C4B62008E70000A19171 /* ExistingFile.Swift */; };
3F01C4B72008E70000889299 /* NewFileA.Swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F01C4B72008E70000889299 /* NewFileA.Swift */; };
4DF01C4B72008E70000882ED /* NewFileB.Swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF01C4B72008E70000882ED /* NewFileB.Swift */; };
注:*.pbxproj merge=union
ファイルに.gitattribues
を追加して、基本的にマージの競合を無視することはお勧めしません。あなたのために。
この他の質問/回答に出くわしたとき、私はこの問題の簡単な解決策を探していました。
https://stackoverflow.com/a/14180388/307217
このソリューションがどれほどシンプルであるかには完全に圧倒されました。トランクの背後にあるほぼ200のリビジョンである異種機能ブランチにマージしようとしていました。このソリューションを試す前に、pbxprojファイル(100以上の競合があった)を手動で8回マージしようとしました。
基本的にソリューションはそのようなものです(Mercurialを使用すると仮定します、それは素晴らしいからです):
Mercurialでマージを試みます。
hg update FEATURE_BRANCH
hg merge default
*Mercurial gives you a ton of crap about the pbxproj file having merge conflicts*
Xcodeを開く
その後、コマンドラインに戻ります。
hg resolve -m ProjectName.xcodeproj/project.pbxproj
*merge any other broken files*
hg commit -m "manually merged with trunk"
時々、1つまたは少数のファイル(たとえば、ManagedObjects)を異なるブランチで再作成できるため、マージするときに、1つのブロック内の1つのファイルに対して2つの宣言がある場合があります。この場合、宣言の1つを削除する必要があります。
上記のように、競合を処理する最も一般的な方法は
私はbash-scriptを書きました。これは上記の(1)を処理します。
これはマージ競合の最も一般的なケースのみを解決することに注意してください!
#!/bin/bash
#
#
#
if [ $# -eq 0 ]
then
echo "File must be provided as argument, darnit!"
exit 1
fi
if [ $# -eq 2 ]
then
echo "only ONE File must be provided as argument, darnit!"
exit 1
fi
echo "Will remove lines from file:" $1
grep -v "<<<<<" $1 | grep -v ">>>>>>" | grep -v "====" > out.tmp;mv out.tmp $1
echo "Done removing lines from file:" $1
私はたまたまこの厄介な問題に遭遇しました。
これらの競合を手動で処理する代わりに、これを試すことができます。
機能ブランチにいるとします。
project.pbxproj
のコンテンツをコピーしますproject.pbxproj
の現在のコンテンツをオーバーライドします)。走る
react-native link
これまでのところ、pbxファイルに使用した中で最高のビジュアルマージツールは、Visual Studio Codeのマージツールです。 Codeアプリでpbxファイルを開き、競合を修正してからXCodeを再度開きます。
ツール「xUnique」を作成しました https://github.com/truebit/xUnique 、機能します!