94 votes

Comment utiliser Git correctement avec XCode ?

J'ai été un développeur iphone pendant un certain temps, et j'ai été récemment y compris git dans mon flux de travail. J'ai utilisé git paramètres qui se trouvent sur http://shanesbrain.net/2008/7/9/using-xcode-with-git pour mon travail jusqu'à présent.

Ces paramètres indiquer à git à exclure *.pbxproj de fusions? Est-il une vraie raison de faire cela? Par exemple, lorsque j'ajoute un fichier dans le projet et pousser à l'origine, à mes collègues développeurs n'auront pas le fichier ajouté à leur projet xcode quand ils tirent. Alors si l'un d'eux construit une version de ce fichier ne peut pas être inclus. Ne pas simplement laisser git gérer les fusionne pour le fichier de projet? Quelqu'un pourrait-il expliquer pourquoi ou pourquoi pas ce fichier doit être dans les fusions et la façon de bien gérer la situation lorsque des fichiers sont ajoutés au projet. Merci.

137voto

J'ai travaillé sur des applications iPhone à temps plein depuis le SDK de lancement, la plupart du temps passé à travailler en équipe avec plusieurs développeurs.

La vérité est que c'est plus nocif pour interdire la fusion de ce .pbxproj fichier qu'il est utile. Comme vous le dites, lorsque vous ajoutez un fichier de moins que les autres à obtenir ce fichier, ils ont aussi l'ajouter à leur projet dans une application de toute taille, qui suce et il emporte également un énorme avantage du contrôle de code source dans le fait que vous ne peut pas vraiment revenir à un projet antérieur, juste par git.

L' .pbxproj fichier est simplement une liste de propriétés (similaire à XML). À partir de l'expérience, à peu près le SEUL conflit de fusion vous étiez jamais obtenir est que si deux personnes ont ajouté des fichiers en même temps. La solution dans 99% des cas de conflit de fusion est de garder les deux côtés de la fusion, qui git au moins tout simplement implique le retrait des >>>>, >>>>, et ==== lignes. En fait, c'est tellement commun que j'ai créé un petit script shell pour fixer un .pbxproj fichier dans un état de fusion à partir de git, je lance à partir de dans le répertoire du projet (dans les Classes de niveau):

#!/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

Pire des cas si elle échoue (vous demandez XCode pour charger le projet et il ne parvient pas à charger), il vous suffit de supprimer le .pbxproj fichier, consultez la maîtrise de git, et re-ajouter vos fichiers. Mais je n'ai jamais eu qui se produisent dans de nombreux mois d'utilisation avec ce script, de nouveau travailler à plein temps sur les applications iPhone avec plusieurs autres développeurs.

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

*.pbxproj text -crlf -diff -merge=union

Puis git toujours deux côtés à une fusion pour l' .pbxproject fichiers ayant le même effet que le script que j'ai fourni que sans travail supplémentaire.

Enfin, voici mon complet .gitignore fichier, montrant ce que je ne l'ai mis à l'ignorer comme il ya quelques choses que vous ne voulez pas dans mon cas est vraiment juste emacs restes et de l'ensemble du répertoire de construction:

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

# old skool
.svn

# osx noise
.DS_Store
profile

9voto

oneyenjug Points 41

Cela fonctionne pour moi dans Xcode 4.6 et Git 1.7.5.

Ajouter et valider le fichier .gitattributes avec ceci :

J’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

9voto

Brian Points 3134

Franchement, les réponses sont trompeuses.

Si vous ne jamais supprimer ou renommer des fichiers, puis à l'aide de l' merge=union stratégie qui combine les différences dans les différentes engage directement, c'est une bonne idée.

Cependant, dans le monde réel, nous avons besoin de supprimer ou de renommer des fichiers parfois. La fusion de ces différences sans aucune modification ferait beaucoup de problèmes dans ces situations, et ces problèmes conduisent généralement à l'espace de travail "de l'Intégrité de l'impossible de charger le projet" de l'émission, qui vous rend même pas en mesure d'exécuter le projet.

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

1) la Conception du projet à bien et ajouter tous les fichiers nécessaires au début, de sorte que vous avez rarement besoin de changer l' project.pbxproj.

2) les caractéristiques de votre tout petit. Ne pas faire trop de choses dans une branche.

3) Pour une raison quelconque, si vous avez besoin de modifier la structure du fichier et obtenir des conflits en project.pbxproj, utilisez votre éditeur de texte préféré pour les résoudre manuellement. Comme vous faites vos tâches minuscules, les conflits risquent d'être facile à résoudre.

3voto

Tom Points 2788

La réponse courte est que même si vous n'avez pas inclure cette ligne dans .gitattributes, vous ne pouvez pas être en mesure de facilement fusionner les deux versions modifiées d'un .pbxproj. C'est mieux pour git de la traiter comme un fichier binaire.

Voir ici pour les détails: Git et pbxproj

Mise à jour: Même si le git livre toujours d'accord avec cette réponse, je ne fais plus. J'ai de contrôle de version mon .pbxproj comme tous les autres non-binaire du fichier source.

2voto

Simon Points 344

Je n'ai créer un script Python pour gérer les conflits de fusion dans XCode fichiers de Projet.

Si vous voulez l'essayer, vous pouvez le vérifier ici: https://github.com/simonwagner/mergepbx

Vous devrez l'installer comme une fusion de pilote, si elle est appelée automatiquement lorsque vous avez un conflit de fusion dans votre fichier de projet (le fichier README.md va vous dire comment le faire).

Il devrait fonctionner beaucoup mieux que d'utiliser merge=union comme mergepbx comprend la sémantique de votre fichier de projet et donc de résoudre le conflit correctement.

Cependant, le projet est encore au stade alpha, ne vous attendez pas à comprendre chaque fichier de projet qui est là.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X