web-dev-qa-db-fra.com

Comment utiliser correctement Git avec Xcode?

Je suis développeur iPhone depuis un certain temps et j'ai récemment inclus git dans mon flux de travail. 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 jusqu'à présent.

Ces paramètres 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 Push to Origin, mes collègues développeurs ne voient 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 simplement laisser git gérer les fusions du fichier de projet? Pourquoi ou pourquoi ce fichier ne devrait pas être en fusion et comment gérer correctement la situation lorsque des fichiers sont ajoutés au projet?

90
rickharrison

J'ai travaillé sur les applications iPhone à temps plein 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 beaucoup plus dangereux de refuser la fusion de ce fichier .pbxproj qu'il n'est utile. Comme vous le dites, lorsque vous ajoutez un fichier à moins que d'autres personnes ne l'obtiennent, elles doivent également l'ajouter à leur projet - dans une application de n'importe quelle taille, ça craint et cela enlève également un énorme avantage du 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 ayez jamais eu, c'est si deux personnes ont ajouté des fichiers en même temps. La solution dans 99% des cas de conflits de fusion est de conserver les deux côtés de la fusion, ce qui pour git implique au moins de supprimer 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 à partir du 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

Le pire des cas s'il échoue (vous demandez à XCode de charger le projet et il ne parvient pas à se charger), vous supprimez simplement le fichier .pbxproj, extrayez le maître de git et rajoutez vos fichiers. Mais je n'ai jamais vu cela se produire depuis de nombreux mois d'utilisation avec ce script, travaillant à nouveau à plein temps sur des applications iPhone avec plusieurs autres développeurs.

Une autre option (soulignée dans les commentaires ci-dessous) que vous pouvez essayer d'utiliser à la place du script, consiste à ajouter cette ligne à un fichier .gitattributes:

*.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 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, vraiment juste les restes d'emacs et tout le répertoire de construction:

# xcode noise
build/*
*.pbxuser
*.mode1v3
*~

# old skool
.svn

# osx noise
.DS_Store
profile

Cela fonctionne pour moi dans Xcode 4.6 et Git 1.7.5.

Ajoutez et validez le fichier .gitattributes avec ceci:

*.pbxproj binary merge=union

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

9
oneyenjug

Franchement, les réponses existantes sont trompeuses.

Si vous jamais supprimez ou renommez des fichiers, utilisez alors le merge=union la stratégie, qui combine directement les différences entre les 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 entraînerait beaucoup de problèmes dans ces situations, et ces problèmes conduisent généralement à l'espace de travail Intégrité - Impossible de charger le projet ", ce qui vous empêche même d'exécuter le projet.

La meilleure solution que j'ai obtenue jusqu'à présent:

1) Concevez bien le projet et ajoutez tous les fichiers nécessaires au début, vous aurez donc rarement besoin de modifier le project.pbxproj.

2) Rendez vos fonctionnalités minuscules. Ne faites pas trop de choses dans une branche.

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 préféré pour les résoudre manuellement. Lorsque vous réduisez vos tâches, les conflits peuvent être faciles à résoudre.

6
Brian

La réponse courte est que même si vous n'incluez pas cette ligne dans .gitattributes, vous ne pourrez peut-être pas fusionner facilement 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 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 binaire.

3
Tom

J'ai créé un script Python qui peut 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, 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 as mergepbx 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.

2
Simon