39

Xcode で、プロジェクト ファイルで Git の競合を回避する最善の方法は何ですか? (私はgit用のXcodeインターフェースを使用せずに、手動のgitを使用しています)

Github から mapbox-ios-sdk を複製してハッキングしたところ、リモート マスターが変更されました。リモートの変更をローカルに取り込もうとすると、マージ後にプロジェクト ファイルでマージの競合が発生します。(具体的には、.xcodeproj 内の project.pbxproj を意味します)

プロジェクトファイルに新しいファイルがある場合、.pbxprojファイルが変更されているように見えるため、プロジェクトファイルを無視する必要はないと思います。(または、私は単純に間違っているので、このファイルを無視する必要がありますか?しかし、最初から mapbox-ios-sdk で無視されていなかったことは明らかです。結局のところ、人々はプロジェクト ファイルを必要としています。)しかし、私も実行しました以前、別の共同作業者との共同プロジェクトでこの競合に陥り、Git を完全に使用できなくなりました。

競合を手動で解決する方法を理解する必要がありますか、またはこれに対処するより良い方法はありますか?

4

9 に答える 9

31

多くの Web サイトでは、次のように .gitattributes ファイルを使用することを単純に提案しています。

*.pbxproj merge=union

スクリプトを使用する前に、このアプローチを試してみましょう。問題が見つかった場合は、必ずこの投稿を更新します。また、他の誰かがこのアプローチにコメントがある場合は、含めてください。

于 2016-05-20T08:21:47.180 に答える
30

プロジェクトに新しいファイルを追加すると、.pbxproj が変更されます。2 人以上の共同作業者が同時にファイルを追加すると、競合が発生します (最初に互いの変更を取得せずに)。私のプロジェクトでは、新しいファイルを追加する前後に次の手順に従ってこれを回避しています。

  1. ファイルを追加する前に、変更をコミットしてから、マスターからプルして最新のファイルを取得します。誰かがファイルを追加した場合は、最新の .pbxproj を取得します。
  2. ファイルを追加します。
  3. すぐに変更をコミットしてマスターにプッシュします (できれば、別の共同作業者が別のファイルを追加する前に)。

弱気ですが、.pbxproj の競合を手動で解決するのは好きではありません。

また、このスタック オーバーフローの質問と優れた回答を参照してください: XCode で Git を適切に使用するには?

于 2012-10-16T05:07:40.623 に答える
5

私のスクリプトxUniqueを確認する必要があります。これは、Apple がアクションを実行する前に Xcode プロジェクト ファイルをマージするための最適なソリューションです。

機能と仕組み

  1. project.pbxprojJSON形式に変換
  2. JSON ですべてobjectsを繰り返し、すべての UUID に絶対パスを指定し、パスの MD5 16 進ダイジェストを使用して新しい UUID を作成します。
    • このjsonオブジェクトのすべての要素は、実際にはツリーとして接続されています
    • 一意の属性を使用して、ツリーのすべてのノードにパス属性を与えます。このパスはルート ノードへの絶対パスです。
    • MD5 hex ダイジェストをノードのパスに適用します
  3. すべての古い UUID を MD5 hex ダイジェストに置き換え、現在のノード ツリーにない未使用の UUID と間違った形式の UUID も削除します。
  4. children、、およびリストを含むプロジェクト ファイルを並べ替え、filesこれらのリスト内の重複するエントリをすべて削除します 。PBXFileReferencePBXBuildFile
    • sort_pbxproj実装を知りたい場合は、xUnique.py のメソッドを参照してください。
    • これは私の modified から移植されたものsort-Xcode-project-fileで、順序PBXFileReferencePBXBuildFile
  5. さまざまなオプションを使用すると、より柔軟にxUniqueを使用できます

詳細については、 READMEファイルを確認してください。

于 2014-08-04T03:33:11.920 に答える
2

ほとんどの場合、次のコードでマージを修正できます。git が追加する行を削除します。

#!/bin/bash
FILE={PRODUCT_NAME}.xcodeproj/project.pbxproj
sed '/======/d' $FILE | sed '/<<<<</d' | sed '/>>>>>/d' > temp
cat temp > $FILE
rm temp

ただし、プロジェクトのグループの名前を変更して競合が発生した場合は、元のグループの余分な行を手動で削除します。

于 2015-08-13T02:44:49.970 に答える
1

次のように Mergepbx を手動で使用することもできます

  1. brew でMergepbxをインストールします。

    brew install mergepbx

  2. プロジェクト ファイルで競合が発生するたびにコマンドを実行して、競合を自動的に解決します。

    git mergetool --tool=mergepbx PROJECT.pbxproj

于 2018-05-01T05:31:54.197 に答える
1

ブランチでマスター コードを取得する必要があるため、マスターからプルを行っていましたが、.pbxproj ファイルを変更し、マスターの構成が異なるため、.pbxproj ファイルで競合が発生していました。次の手順に従って解決してください

Finder で .pbxproj を開きます-> ファイルを右クリックします [パッケージの内容を表示] -> [選択] を選択します。pbxproj ファイルTextEdit で開く- > 以下のように競合行が表示されます。

<<<<<<< HEAD"
// head changes
===========
// Your changes
>>>>>>>>

ヘッドの変更と変更から適切なものを選択し、残りを削除します。コードをコミットします

git add .
git commit -m"conflict resolved"
git status // Check you files status

すべてが問題なければ、コードをプッシュします。

git push
于 2020-01-30T06:29:06.553 に答える