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!
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é".
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.
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.
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):
-
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*
-
Ouvrir Xcode
- dans la barre d'outils supérieure, sélectionnez Xcode - >ouvrir L'outil développeur - > FileMerge
- à gauche, ouvrez votre projet conflictuel.fichier pbxproj ' (celui avec un balisage de conflit de fusion)
- Sur le côté droit, ouvrez votre 'projet.pbxproj.orig "
- sélectionnez Fichier - > Enregistrer la fusion et enregistrer sur le projet.pbxproj fichier
-
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"
- Mangez Du Gâteau Parce Que Vous Avez Terminé
Comme indiqué ci-dessus, la façon la plus courante de gérer les conflits est de
- accepter "tout"
- 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
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.
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
etNewFileB.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.
J'ai fondé un outil "xUnique" https://github.com/truebit/xUnique, ça fonctionne!
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.