Je suis développeur iphone depuis un certain temps et j'ai récemment inclus git dans mon workflow. Jusqu'à présent, j'ai utilisé les paramètres git trouvés sur http://shanesbrain.net/2008/7/9/using-xcode-with-git pour mon flux de travail.
Ces paramètres indiquent à git d'exclure * .pbxproj des fusions? Y a-t-il une vraie raison de faire cela? Par exemple, lorsque j'ajoute un fichier au projet et le pousse à l'origine, mes collègues développeurs n'auront pas ce fichier ajouté à leur projet xcode lorsqu'ils tirent. Ensuite, si l'un d'eux crée une version, ce fichier peut ne pas être inclus. Ne devrais-je pas laisser git gérer les fusions du fichier projet? Pourquoi ou pourquoi pas ce fichier devrait-il être en fusion et comment gérer correctement la situation lorsque des fichiers sont ajoutés au projet?
la source
Réponses:
J'ai travaillé sur des applications iPhone à plein temps depuis le lancement du SDK, la plupart de ce temps passé à travailler en équipe avec plusieurs développeurs.
La vérité est qu'il est bien plus dangereux d'interdire la fusion de ce fichier .pbxproj que cela n'est utile. Comme vous le dites, lorsque vous ajoutez un fichier à moins que d'autres personnes ne l'obtiennent, ils doivent également l'ajouter à leur projet - dans une application de n'importe quelle taille, c'est nul et cela enlève également un énorme avantage au contrôle du code source en ce que vous ne peut pas vraiment revenir à un état de projet antérieur complet uniquement via git.
Le fichier .pbxproj est simplement une liste de propriétés (similaire à XML). Par expérience, à peu près le SEUL conflit de fusion que vous avez rencontré 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 implique au moins simplement de supprimer toutes les lignes >>>>, <<<< et ====. En fait, c'est si courant que j'ai créé un simple script shell pour corriger un fichier .pbxproj dans un état de fusion à partir de git, je l'exécute depuis le répertoire du projet (au niveau des classes):
Dans le pire des cas, si cela échoue (vous demandez à XCode de charger le projet et le chargement échoue), vous supprimez simplement le fichier .pbxproj, extrayez le maître de git et rajoutez vos fichiers. Mais je n'ai jamais eu cela pendant de nombreux mois d'utilisation 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 essayer d'utiliser à la place du script, consiste à ajouter cette ligne à un fichier .gitattributes:
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 aucun travail supplémentaire.
Enfin, voici mon fichier .gitignore complet, montrant ce que je l'ai configuré pour ignorer car il y a quelques choses que vous ne voulez pas - dans mon cas, en réalité, juste les restes d'emacs et tout le répertoire de construction:
la source
union
commutateur:*.pbxproj text/plain -crlf -diff -merge union
.Cela fonctionne pour moi dans Xcode 4.6 et Git 1.7.5.
Ajoutez et validez le fichier .gitattributes avec ceci:
J'ai testé cela 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 source
Franchement, les réponses existantes sont trompeuses.
Si vous ne supprimez ou ne renommez jamais de fichiers, alors utiliser la
merge=union
stratégie, 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 aucune modification poserait de nombreux 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 eue 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 fichier
project.pbxproj
.2) Rendez vos fonctionnalités minuscules. Ne faites pas trop de choses dans une succursale.
3) Pour une raison quelconque, si vous devez modifier la structure du fichier et générer des conflits
project.pbxproj
, utilisez votre éditeur de texte préféré pour les résoudre manuellement. Au fur et à mesure que vous réduisez vos tâches, les conflits peuvent être faciles à résoudre.la source
La réponse courte est que même si vous n'incluez pas cette ligne
.gitattributes
, vous ne pourrez peut-être pas facilement fusionner deux versions modifiées d'un .pbxproj. Il vaut mieux que git le traite comme un binaire.Voir ici pour plus de détails: Git et pbxproj
Mise à jour: même si le livre git est toujours d'accord avec cette réponse, je ne le fais plus. Je contrôle ma version
.pbxproj
comme n'importe quel autre fichier source non binaire.la source
simplejson
ou un tel plus propre sur son chemin vers l'index. Cependant, il ne serait toujours pas garanti de fonctionner..pbxproj
est en fait un ancien fichier NeXT / Cocoa PList, qui est plus ancien et défini beaucoup plus tôt que JSON, et maintenant obsolète par Apple. (mais ils l'utilisent encore à certains endroits) La mention du fichier dans le livre est complètement fausse. J'ai supprimé le vote parce que vous l'avez mentionné explicitement.J'ai créé un script Python capable de gérer les conflits de fusion dans les fichiers du 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, il est donc appelé automatiquement lorsque vous avez un conflit de fusion dans votre fichier de projet (le README.md vous dira comment faire).
Cela devrait fonctionner beaucoup mieux que d'utiliser
merge=union
commemergepbx
comprend la sémantique de votre fichier de projet et résoudra donc correctement le conflit.Cependant, le projet est toujours alpha, ne vous attendez pas à ce qu'il comprenne tous les fichiers de projet qui existent.
la source