web-dev-qa-db-ja.com

Xcodeで競合(ファイルproject.pbxproj)をマージするにはどうすればsvnを使用しますか?

私たちのチームには2人のメンバーがいます。 XcodeのSCM(SVNを使用)を使用して、ソースコードファイルを管理します。
すべてのファイルをXcodeプロジェクトに追加します。彼はSVNサーバーにコミットしています。更新すると、Xcodeはproject.pbxprojファイルに競合があることを検出します。次に、[Xcodeを終了]を選択し、手動で競合をマージします。次に、project.pbxprojの編集を開始し、変更をマージします。実際、Xcodeがファイルを管理する方法がわかりません。project.pbxprojファイルにないテキストを追加するだけです。終了すると、プロジェクトを開くことができません。 project.pbxprojファイルは手動で編集できないためだと思います。

だから、この問題を見つけたときにproject.pbxprojファイルに競合があることを知りたいのですが、どのように解決するのですか?

ありがとうございました!

61
vcLwei

残念ながら、1回のチェックアウトで手動で変更を行ってから、新しく「マージされた」プロジェクトをチェックインする以外にできることはあまりありません。

25
Barry Wark

私はgitを使用していますが、同じ問題が発生します。2人でファイルを追加すると、マージの競合が発生します。

通常、編集は非常に簡単です。テキストエディタでproject.pbxprojファイルに移動し、マージの競合セクションを探します。通常、次のようなマークが付けられます。

>>>>>>>
Stuff 1
======
Stuff 2
<<<<<<<<

Xcodeプロジェクトのマージの競合の99%のケースでは、マージの両側を受け入れるだけです(2人が異なるファイルを追加したため)-マージマーカーを削除するだけで、上記の場合は次のようになります。

Stuff 1
Stuff 2

私が言ったように、これはほとんどの場合にうまく機能します。完了してもXcodeがプロジェクトファイルを読み取らない場合は、最新のマージされていないバージョンを使用して、ファイルを手動で再度追加してください。

このソリューションはgit専用ですが、.gitattributesファイルをプロジェクトに追加し、そのファイル内に次の行を追加します。

*.pbxproj merge=union

これにより、gitにマージの両側を保持するように指示します。

7
mmilleruva

マージの競合を手動で解決するには、競合する各アイテムの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を確認します。

  • 両方のバージョンで発生する場合は、1つのバージョンで削除してください: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を追加して、基本的にマージの競合を無視することはお勧めしません。あなたのために。

3
Manuel

この他の質問/回答に出くわしたとき、私はこの問題の簡単な解決策を探していました。

https://stackoverflow.com/a/14180388/307217

このソリューションがどれほどシンプルであるかには完全に圧倒されました。トランクの背後にあるほぼ200のリビジョンである異種機能ブランチにマージしようとしていました。このソリューションを試す前に、pbxprojファイル(100以上の競合があった)を手動で8回マージしようとしました。

基本的にソリューションはそのようなものです(Mercurialを使用すると仮定します、それは素晴らしいからです):

  1. Mercurialでマージを試みます。

    hg update FEATURE_BRANCH
    hg merge default
    *Mercurial gives you a ton of crap about the pbxproj file having merge conflicts*
    
  2. Xcodeを開く

  3. 上部のツールバーからXcode-> Open Developer Tool-> FileMergeを選択します
  4. 左側で、競合する 'project.pbxproj'ファイル(マージ競合マークアップが含まれているファイル)を開きます。
  5. 右側で、「project.pbxproj.orig」を開きます
  6. 「ファイル」->「マージの保存」を選択し、「project.pbxproj」ファイルを上書き保存します
  7. その後、コマンドラインに戻ります。

    hg resolve -m ProjectName.xcodeproj/project.pbxproj
    *merge any other broken files*
    hg commit -m "manually merged with trunk"
    
  8. あなたがされているのでケーキを食べる
3
G. Shearer

時々、1つまたは少数のファイル(たとえば、ManagedObjects)を異なるブランチで再作成できるため、マージするときに、1つのブロック内の1つのファイルに対して2つの宣言がある場合があります。この場合、宣言の1つを削除する必要があります。

2
realbusyman

上記のように、競合を処理する最も一般的な方法

  1. 「すべて」を受け入れる
  2. ファイルをプロジェクトに再インポートします

私は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
2
tommys

私はたまたまこの厄介な問題に遭遇しました。

これらの競合を手動で処理する代わりに、これを試すことができます。
機能ブランチにいるとします。

  1. Gitチェックアウトマスター。
  2. project.pbxprojのコンテンツをコピーします
  3. 機能ブランチにGitチェックアウトし、貼り付けます(project.pbxprojの現在のコンテンツをオーバーライドします)。
  4. 走る

    react-native link
    
1
qinmu2127

これまでのところ、pbxファイルに使用した中で最高のビジュアルマージツールは、Visual Studio Codeのマージツールです。 Codeアプリでpbxファイルを開き、競合を修正してからXCodeを再度開きます。

0
Ali Ersöz

ツール「xUnique」を作成しました https://github.com/truebit/xUnique 、機能します!

0
lighter