76

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

だから、私はあなたがこの問題を見つけたとき、project.pbxprojファイルに競合があることを知りたいのですが、それを解決する方法は?

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

4

13 に答える 13

151

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

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

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

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

Stuff 1
Stuff 2

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

于 2010-01-05T16:19:50.947 に答える
28

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

于 2010-01-05T05:53:21.163 に答える
19

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

*.pbxproj merge=union

これにより、gitはマージの両側を保持するようになります。これは、ほとんどの場合、必要なものになります。

于 2016-03-15T18:32:41.703 に答える
10

マージの競合を手動で解決するには、競合する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.swiftNewFileB.swift
  • それがファイル内の他の場所で参照されていない場合、つまりファイル全体で1つのオカレンスしか見つからない場合、project.pbxprojそれはアーティファクトであり、安全に削除できると思います。

結果は次のようになります。

    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マージの競合を基本的に無視することはお勧めしません。高度なスクリプトがない限り、競合するマージは常に手動でチェックする必要があるためです。

于 2018-09-05T12:34:08.477 に答える
3

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

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

私はこのソリューションがいかに単純であるかに完全に驚かされました。トランクの背後にあるほぼ200のリビジョンである異種の機能ブランチにマージしようとしていましたが、XCodeとMercurialはそれについて満足していませんでした。このソリューションを試す前に、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]->[開発者ツールを開く]->[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. あなたが終わったのでケーキを食べる
于 2013-03-27T20:22:13.580 に答える
2

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

于 2012-06-08T15:57:48.263 に答える
2

上で述べたように、競合を処理する最も一般的な方法は次のとおりです。

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

上記(1)を処理するbashスクリプトを作成しました。

これは、マージの競合の最も一般的なケースのみを解決することに注意してください。

#!/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
于 2016-04-19T11:11:39.777 に答える
2

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

于 2019-03-13T17:27:59.957 に答える
1

私はたまたまこのトリッキーな問題に遭遇しました。

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

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

    react-native link
    
于 2018-12-20T11:47:36.467 に答える
1

VSCODEで開き、そこで競合するマージを修正できます。IDEで色付きの注釈を探すか、テキスト検索で<<<>>>を探します。

于 2019-09-16T19:59:12.830 に答える
0

私はツール「xUnique」https://github.com/truebit/xUniqueを設立しました、それは動作します!

于 2016-01-26T08:36:43.410 に答える
0

競合の90%は明確であり、競合の両方の変更を受け入れることができるので、xUniqueのようなツールを使用すると非常に役立つことがわかったので、辛抱強く解決することを心配する必要はありません。

于 2020-11-21T08:29:19.943 に答える
-25

最善の方法は、2つを組み合わせようとせずに、自分のバージョンまたはそのバージョン全体を受け入れることです。また、問題のファイルがリポジトリにあるべきものであるかどうかを検討してください。それぞれの人に独自のバージョンを持たせる方が適切な場合があります。

競合を解決する方法に関するドキュメントを確認してください。

于 2010-01-05T14:15:22.680 に答える