web-dev-qa-db-fra.com

Comment fusionner les conflits (fichier project.pbxproj) dans Xcode use svn?

Il y a deux membres dans notre équipe. Nous utilisons le SCM de Xcode (utilisez SVN) pour gérer nos fichiers de code source.
Nous ajoutons tous des fichiers à notre projet Xcode. Il s'est engagé sur le serveur SVN. Lorsque je mets à jour, Xcode trouve des conflits dans project.pbxproj fichier. Ensuite, je sélectionne quitter Xcode et fusionner manuellement les conflits. Ensuite, je commence à modifier mon project.pbxproj, fusionner nos modifications. En fait, je ne sais pas comment Xcode gère les fichiers, j'ajoute juste du texte que mon project.pbxproj le fichier ne comportait pas. Quand j'ai fini, mon projet ne peut pas s'ouvrir. Je suppose que parce que le project.pbxproj le fichier ne peut pas être modifié manuellement.

Donc, je veux savoir, lorsque vous rencontrez ce problème, le fichier project.pbxproj a des conflits, comment le résoudre?

Merci!

61
vcLwei

Malheureusement, il n'y a pas grand-chose que vous puissiez faire, sauf pour effectuer les modifications manuellement en une seule extraction, puis archiver le nouveau projet "fusionné".

25
Barry Wark

J'utilise git mais nous voyons le même problème - si deux personnes ajoutent des fichiers, il y a un conflit de fusion.

Habituellement, l'édition est très facile. Accédez simplement au fichier project.pbxproj avec un éditeur de texte et recherchez la section des conflits de fusion - généralement, elle est marquée par quelque chose comme:

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

Dans 99% des cas de conflit de fusion du projet Xcode, vous voulez simplement accepter les deux côtés de la fusion (parce que deux personnes ont ajouté des fichiers différents) - vous supprimeriez donc simplement les marqueurs de fusion, dans le cas ci-dessus qui se termineraient comme:

Stuff 1
Stuff 2

Comme je l'ai dit, cela fonctionne très bien dans la plupart des cas. Si Xcode ne lira pas le fichier de projet lorsque vous avez terminé, prenez simplement la version non fusionnée la plus récente et ajoutez à nouveau manuellement vos fichiers.

Cette solution est uniquement pour git, mais vous pouvez ajouter un .gitattributes fichier à votre projet puis dans ce fichier ajoutez la ligne suivante:

*.pbxproj merge=union

Cela indiquera à git de conserver les deux côtés de la fusion, ce qui sera ce que vous voulez la grande majorité du temps.

7
mmilleruva

Pour résoudre manuellement les conflits de fusion, vérifiez le UUID de chaque élément en conflit.

Exemple:

<<<<<<< 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

Vérifiez chaque UUID:

  • S'il se produit dans les deux versions, supprimez-le dans une seule version: ExistingFile.Swift
  • S'il ne se produit pas sur la branche de comparaison, conservez-le: NewFileA.Swift et NewFileB.Swift
  • S'il n'est référencé nulle part ailleurs dans le fichier, c'est-à-dire que vous ne pouvez trouver qu'une seule occurrence dans l'ensemble project.pbxproj fichier, je suppose que c'est un artefact et sûr de le supprimer.

Le résultat serait:

    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 */; };

Remarque: Je ne recommande pas d'ajouter *.pbxproj merge=union au .gitattribues fichier pour ignorer les conflits de fusion, car une fusion conflictuelle doit toujours être vérifiée manuellement, à moins qu'un script sophistiqué ne le fasse pour vous.

3
Manuel

Je cherchais une solution simple à ce problème lorsque je suis tombé sur cette autre question/réponse:

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

J'ai été complètement époustouflé par la simplicité de cette solution, j'essayais de fusionner dans une branche de fonctionnalités disparate qui était à près de 200 révisions derrière le coffre, XCode et Mercurial n'étaient pas des campeurs heureux à ce sujet. J'ai essayé de fusionner manuellement le fichier pbxproj (qui avait plus de 100 conflits) 8 fois avant d'essayer cette solution.

Fondamentalement, la solution est en tant que telle (en supposant que vous utilisez Mercurial, car c'est génial):

  1. Tentez votre fusion dans Mercurial:

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

  3. Dans la barre d'outils supérieure, sélectionnez Xcode-> Open Developer Tool-> FileMerge
  4. Sur la gauche, ouvrez votre fichier "project.pbxproj" en conflit (celui contenant le balisage de conflit de fusion)
  5. Sur le côté droit, ouvrez votre 'project.pbxproj.orig'
  6. Sélectionnez Fichier-> Enregistrer la fusion et enregistrez sur le fichier 'project.pbxproj'
  7. Puis revenez à la ligne de commande:

    hg resolve -m ProjectName.xcodeproj/project.pbxproj
    *merge any other broken files*
    hg commit -m "manually merged with trunk"
    
  8. Mangez du gâteau parce que vous avez terminé
3
G. Shearer

Parfois, un ou quelques fichiers peuvent être recréés (par exemple ManagedObjects) dans différentes branches, donc lorsque vous fusionnerez, il peut y avoir deux déclarations pour un fichier dans un bloc. Dans ce cas, vous devez supprimer l'une des déclarations.

2
realbusyman

Comme indiqué ci-dessus, le moyen le plus courant de gérer les conflits consiste à

  1. accepter "tout"
  2. réimporter les fichiers dans le projet

J'ai écrit un bash-script qui s'occupe de (1) ci-dessus.

Notez que cela ne résoudra que le cas le plus courant de conflits de fusion!

#!/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

Il m'est arrivé de rencontrer ce problème délicat.

Au lieu de traiter manuellement ces conflits, vous pouvez essayer ceci.
Supposons que vous soyez sur la branche de fonctionnalité.

  1. Git checkout master.
  2. Copiez le contenu dans project.pbxproj
  3. Git checkout dans votre branche de fonctionnalité et collez-la. (Remplacez le contenu actuel dans project.pbxproj)
  4. Courir

    react-native link
    
1
qinmu2127

Jusqu'à présent, le meilleur outil de fusion visuelle que j'ai utilisé pour les fichiers pbx est l'outil de fusion de Visual Studio Code. J'ouvre le fichier pbx dans l'application Code et corrige les conflits, puis j'ouvre à nouveau XCode.

0
Ali Ersöz

J'ai fondé un outil "xUnique" https://github.com/truebit/xUnique , ça marche!

0
lighter