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!
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é".
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.
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:
ExistingFile.Swift
NewFileA.Swift
et NewFileB.Swift
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.
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):
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*
Ouvrir Xcode
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"
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.
Comme indiqué ci-dessus, le moyen le plus courant de gérer les conflits consiste à
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
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é.
project.pbxproj
project.pbxproj
)Courir
react-native link
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.
J'ai fondé un outil "xUnique" https://github.com/truebit/xUnique , ça marche!