Je suis développeur de iphone depuis un certain temps et j’ai récemment inclus git dans mon stream de travail. J’ai utilisé les parameters git sur http://shanesbrain.net/2008/7/9/using-xcode-with-git pour mon stream de travail jusqu’à présent.
Ces parameters indiquent à git d’exclure * .pbxproj des fusions? Y a-t-il une vraie raison pour cela? Par exemple, lorsque j’ajoute un fichier au projet et que je pousse à l’origine, mes collègues développeurs n’auront pas ce fichier ajouté à leur projet xcode lorsqu’ils seront tirés. Ensuite, si l’un d’entre eux génère une version, ce fichier peut ne pas être inclus. Ne devrais-je pas laisser git gérer les fusions pour le fichier de projet? Quelqu’un pourrait-il expliquer pourquoi ou pourquoi ce fichier ne doit pas être dans les fusions et comment gérer correctement la situation lorsque des fichiers sont ajoutés au projet. Merci.
J’ai travaillé sur les applications iPhone à plein temps depuis le lancement du SDK, et la plupart du temps, j’ai travaillé sur des équipes avec plusieurs développeurs.
La vérité est que c’est plus dangereux de ne pas autoriser la fusion de ce fichier .pbxproj qu’il n’est utile. Comme vous le dites, lorsque vous ajoutez un fichier à moins que les autres utilisateurs ne le récupèrent, ils doivent également l’append à leur projet – dans une application de toute taille, qui craint et profite également du contrôle du code source. ne peut pas vraiment revenir à un état de projet complet antérieur par le biais de git.
Le fichier .pbxproj est simplement une liste de propriétés (similaire à XML). D’expérience, à peu près le seul conflit de fusion que vous ayez jamais rencontré, c’est si deux personnes ont ajouté des fichiers en même temps. La solution dans 99% des cas de conflit de fusion est de conserver les deux côtés de la fusion, ce qui, pour git au moins, implique simplement de supprimer les lignes >>>>, <<<< et ====. En fait, c'est tellement commun que j'ai créé un script shell simple pour corriger un fichier .pbxproj dans un état de fusion de git, je l'exécute depuis le répertoire du projet (au niveau des classes):
#!/bin/sh projectfile=`find -d . -name 'project.pbxproj'` projectdir=`echo *.xcodeproj` projectfile="${projectdir}/project.pbxproj" tempfile="${projectdir}/project.pbxproj.out" savefile="${projectdir}/project.pbxproj.mergesave" cat $projectfile | grep -v "<<<<<<< HEAD" | grep -v "=======" | grep -v "^>>>>>>> " > $tempfile cp $projectfile $savefile mv $tempfile $projectfile
Dans le pire des cas, si cela échoue (vous demandez à XCode de charger le projet et celui-ci ne se charge pas), il vous suffit de supprimer le fichier .pbxproj, d’extraire le fichier maître de git et de rappend vos fichiers. Mais cela ne s’est jamais produit depuis plusieurs mois avec ce script, travaillant à nouveau à plein temps sur des applications iPhone avec plusieurs autres développeurs.
Une autre option (indiquée dans les commentaires ci-dessous) que vous pouvez utiliser à la place du script consiste à append cette ligne à un fichier .gitatsortingbutes:
*.pbxproj text -crlf -diff -merge=union
Ensuite, git prendra toujours les deux côtés d’une fusion pour les fichiers .pbxproject, ayant le même effet que le script que j’ai fourni uniquement sans travail supplémentaire.
Enfin, voici mon fichier complet .gitignore, montrant ce que je dois le faire ignorer car il y a quelques petites choses que vous ne voulez pas – dans mon cas, il ne s’agit que de remnets d’emacs et de tout le répertoire de compilation:
# xcode noise build/* *.pbxuser *.mode1v3 *~ # old skool .svn # osx noise .DS_Store profile
Franchement, les réponses existantes sont trompeuses.
Si vous ne supprimez ou ne renommez jamais de fichiers, utiliser la stratégie merge=union
, qui combine directement les différences entre différents commits, est une bonne idée.
Cependant, dans le monde réel, nous devons parfois supprimer ou renommer des fichiers. La fusion des différences sans modification entraînerait beaucoup de problèmes dans ces situations, et ces problèmes conduisent généralement au problème “Intégrité de l’espace de travail – Impossible de charger le projet”, ce qui vous empêche même d’exécuter le projet.
La meilleure solution que j’ai eu jusqu’à présent:
1) Concevez bien le projet et ajoutez tous les fichiers nécessaires au début, vous aurez donc rarement besoin de changer le project.pbxproj
.
2) Rendez vos fonctionnalités minuscules. Ne fais pas trop de choses dans une twig.
3) Pour une raison quelconque, si vous devez modifier la structure du fichier et obtenir des conflits dans project.pbxproj
, utilisez votre éditeur de texte favori pour les résoudre manuellement. Au fur et à mesure que vous réduisez vos tâches, les conflits peuvent être faciles à résoudre.
Cela fonctionne pour moi dans Xcode 4.6 et Git 1.7.5.
Ajoutez et validez le fichier .gitatsortingbutes avec ceci:
*.pbxproj binary merge=union
Je l’ai testé avec un autre membre de l’équipe et fonctionne très bien.
Tiré de: http://robots.thoughtbot.com/post/33796217972/xcode-and-git-bridging-the-gap
La réponse courte est que même si vous n’incluez pas cette ligne dans .gitatsortingbutes
, vous ne pourrez peut-être pas facilement fusionner deux versions modifiées d’un fichier .pbxproj. C’est mieux pour git de le traiter comme un binary.
Voir ici pour plus de détails: Git et pbxproj
Mise à jour: Même si le livre de git est toujours d’accord avec cette réponse, je ne le fais plus. Je contrôle la version de mon .pbxproj
comme tout autre fichier source non binary.
J’ai créé un script Python capable de gérer les conflits de fusion dans les fichiers de projet XCode.
Si vous voulez l’essayer, vous pouvez le vérifier ici: https://github.com/simonwagner/mergepbx
Vous devrez l’installer en tant que pilote de fusion afin qu’il soit appelé automatiquement lorsque vous avez un conflit de fusion dans votre fichier de projet (le fichier README.md vous indiquera comment procéder).
Cela devrait fonctionner beaucoup mieux que d’utiliser merge=union
car mergepbx
comprend la sémantique de votre fichier de projet et résoudra donc le conflit correctement.
Cependant, le projet est toujours en alpha, ne vous attendez pas à ce qu’il comprenne tous les fichiers de projets disponibles.