Comment fusionner les conflits (projet de fichier.pbxproj) dans Xcode utiliser svn?

Il y a deux membres dans notre équipe. Nous utilisons SCM de Xcode (utiliser SVN) pour gérer nos fichiers de code source.
Nous ajoutons tous des fichiers à notre projet Xcode. Il s'est engagé à SVN server. Lorsque je mets à jour, Xcode trouve des conflits dans le fichier project.pbxproj. Ensuite, je sélectionne quit Xcode et fusionne manuellement les conflits. Ensuite, je commence à éditer 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 fichier project.pbxproj n'avait pas. Quand j'ai fini, mon projet ne peut pas s'ouvrir. Je suppose cela parce que le fichier project.pbxproj ne peut pas être édité manuellement.

Donc, je veux savoir, quand vous trouvez ce problème, le projet.pbxproj fichier des conflits, comment le résoudre?

Merci!

53
demandé sur Forge 2010-01-05 07:19:49

9 réponses

Malheureusement, il n'y a pas grand-chose que vous pouvez faire, sauf pour effectuer les modifications manuellement dans un check-out et ensuite vérifier dans le nouveau projet "fusionné".

18
répondu Barry Wark 2010-01-05 05:53:21

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. Il suffit d'aller dans le projet.fichier pbxproj avec un éditeur de texte, et recherchez la section de conflit de fusion-généralement, cela est marqué par quelque chose comme:

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

Dans 99% des cas de conflit de fusion de 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 supprimez simplement les marqueurs de fusion, dans le cas ci-dessus qui finirait comme:

Stuff 1
Stuff 2

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

124
répondu Kendall Helmstetter Gelner 2012-06-07 03:59:59

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 garder les deux côtés de la fusion qui sera ce que vous voulez la grande majorité du temps.

4
répondu mmilleruva 2016-03-15 18:32:41

Je cherchais une solution simple à ce problème quand 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é disparate qui était presque 200 révisions derrière le tronc, 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, parce que c'est génial):

  1. Essayez 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 - >ouvrir L'outil développeur - > FileMerge
  4. à gauche, ouvrez votre projet conflictuel.fichier pbxproj ' (celui avec un balisage de conflit de fusion)
  5. Sur le côté droit, ouvrez votre 'projet.pbxproj.orig "
  6. sélectionnez Fichier - > Enregistrer la fusion et enregistrer sur le projet.pbxproj fichier
  7. Puis retour à 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
répondu G. Shearer 2017-05-23 11:47:26

Comme indiqué ci-dessus, la façon la plus courante de gérer les conflits est de

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

, j'ai Écrit un bash script qui prend soin 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
1
répondu tommys 2016-04-19 11:11:39

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

1
répondu realbusyman 2016-10-09 10:34:07

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:

  • si cela se produit dans les deux versions, supprimez - le dans une version: ExistingFile.swift
  • si elle ne se produit pas sur la branche de comparaison, conservez-la: 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 du fichier project.pbxproj, je suppose que c'est un artefact et sûr à supprimer il.

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

Note: Je ne recommande pas d'ajouter *.pbxproj merge=union au fichier .gitattribues pour ignorer fondamentalement 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.

0
répondu Manuel 2018-09-05 12:39:23

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

-1
répondu lighter 2016-01-26 08:36:43

La meilleure chose à faire pourrait être de simplement accepter soit votre version ou sa version dans son intégralité, sans essayer de combiner les deux. Aussi, considérez si le fichier en question Est quelque chose qui devrait être dans le référentiel du tout; il peut être plus approprié de laisser chaque personne avoir sa propre version de celui-ci.

Consultez la documentation sur la façon de résoudre les conflits.

-20
répondu Michael Hackner 2010-01-05 14:15:22