Xcode changements non modifié storyboard et fichiers XIB
Les story-boards sont plutôt une douleur royale à partir d'un workflow git point de vue lorsque plusieurs personnes travaillent sur eux. Par exemple, le code XML dans le .storyboard fichier de départ, <document>
de la balise toolsVersion
et systemVersion
attributs modifiés par tout ce que la configuration la plus récente du fichier manipulateur se trouve être en cours d'exécution. La synchronisation de tout le monde Xcode versions précisément semble aider avec toolsVersion
, mais systemVersion
changements n'importe quoi, selon les Mac et/ou OS X version, le développeur est en cours d'exécution.
C'est idiot, mais la plupart sont inoffensifs. Ce qui nous inquiète, c'est que, à d'autres moments, d'autres modifications sont automatiquement appliquées à la table de montage séquentiel, juste en ouvrant après un git pull
. C'est-à-dire, Alice apporte des modifications à un plan de montage, s'engage et les pousse vers le référentiel. Bob tire alors Alice changements et ouvre le storyboard pour faire d'autres modifications. Au moment où il ouvre la table de montage séquentiel, l'icône du fichier change immédiatement à une modification de l'-mais-non enregistrées de l'état, et un git status
montre que tout nombre de bizarre changements ont eu lieu. Tout cela sans Bob avoir changé quoi que ce soit ou de sauvegarder le fichier en lui-même.
Les plus courantes automatisée des changements que nous voyons, c'est la disparition ou la réapparition de l'ensemble de la <classes>
tag de la hiérarchie de proximité de la fin d'un scénario de fichier. Nous n'avons pas compris ce qui est à l'origine. On peut avoir plusieurs versions localisées d'une table de montage séquentiel dans divers .lproj répertoires, et lors de l'ouverture d'eux à l'intérieur d'Interface Builder, la hiérarchie de classe peuvent spontanément être retiré de certains et a ajouté dans d'autres, ou laissé seul dans certains cas. Cela provoque beaucoup de bruit dans git diff
, mais il ne fait pas de pause toutes les fonctionnalités. Nous allons souvent de façon sélective ajouter les modifications que nous avons apportées dans le dépôt git de l'index, engager les gens, et puis il suffit de jeter le spontané, absurde <classes>
changements. C'est pour commet de petits et agréable, comme ils devraient l'être. Finalement, si, ça devient tout simplement trop beaucoup de s'embêter avec depuis Xcode conserve re-faire les modifications, et que quelqu'un vient ragecommits avec quelques autres trucs... ce qui est bien jusqu'à ce que quelqu'un d'autre Xcode décide de vouloir les modifier sans raison apparente. (Notre commettre l'histoire a beaucoup de prestation de serment-dessus.)
Est ce que quelqu'un d'autre voir ce comportement? Est-ce une Xcode bug ou un problème de configuration sur un ou plusieurs de nos développeurs Mac? Nous avons vu quelques un comportement similaire lors d'une collaboration avec XIB fichiers, mais les storyboards semblent plus sensibles à ce.
- En effet, les projets Xcode et Git sont pas très bien ensemble. Je ne pense pas que vous pouvez éviter ce gâchis d'autre moyen que de jeter les changements qui sont inutiles - qui sont presque toujours le projet de modification des fichiers de pour moi et d'autres fichiers xml, je suis sûr que je n'ai pas changé. Va être content si il ya toute sorte de "solution". J'aime Perforce pour la pratique fonctionnalité de verrouillage permettant pas Xcode trop changer, que, probablement, peut-être fait manuellement les fichiers que vous n'allez pas changer, mais seulement pour examen.
- Pas la peine d'utiliser des story-boards avec git ou autre chose. Ils ne sont pas conçus pour s'engager sympathique. Nous a donné et suis avec .xib, ce qui n'est pas génial non plus, mais au moins c'est précis.
- Nous avons trouvé des story-boards assez soignée pour pas mal de choses en fait, mais il est souvent nécessaire de les mélanger avec de l'XIBs. Si ce bug n'est jamais fixe, nous serions très heureux de travailler avec eux la grande majorité du temps.
- Je viens de commenter sur ahwulf commentaire: ce qui dans le monde voulez-vous dire qu'ils ne sont pas commettre de l'environnement? Ils sont XML/les fichiers de texte, c'est à propos de s'engager convivial que vous pouvez obtenir. Et j'ai eu " aucun problème avec la table de montage séquentiel et un système de contrôle de version, le seul problème est bien sûr que xcode parfois supprime le <catégories> tag puis readds plus tard, mais vous pouvez le voir facilement si vous regardez les changements avec un git GUI ou git -p ou équivalent quelle que soit dvcs. Je n'ai jamais eu ce cas avec le .pbxproj fichier en tant que titre d'information.
- Je ne comprends pas pourquoi xcode mettre les classes de blocs à l'intérieur de la table de montage séquentiel s'il suffit de générer les blocs en lisant les classes de fichiers? sont-ils une sorte de "cache"? si oui, ils doivent être mis dans une des classes.fichier de cache de sorte que nous pourrions l'exclure de la gestion des versions...
- Je n'ai rien à contribuer à ce débat, d'autres que mon pur désespoir à cette situation.
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas un bug, c'est une conséquence de la façon dont Xcode processus de storyboard fichiers.
Je suis en train d'écrire un diff et le programme de fusion de storyboard fichiers (GitHub lien) et j'ai passé des heures à analyser la table de montage séquentiel des fichiers de la logique et de la façon dont Xcode processus. C'est ce que j'ai découvert:
Pourquoi faire bizarre de changements se produisent dans le storyboard fichiers?
Xcode utilise le NSXML API pour analyser storyboard des fichiers dans des
NSSet
logique de la structure en arborescence. Lorsque Xcode doit écrire les changements qu'il crée unNSXMLDocument
basé sur la logique de l'arborescence de la structure, efface le storyboard de fichiers et d'appelsXMLDataWithOptions:
pour remplir à nouveau le fichier. Parce que les ensembles de ne pas conserver l'ordre de leurs éléments, même la moindre modification pourrait changer l'ensemble du storyboard fichier XML.Pourquoi la classe tag disparaissent ou réapparaissent aléatoirement?
Le
<class>
section n'est rien de plus qu'un interne Xcode cache. Xcode utiliser pour mettre en cache des informations sur les classes. Les modifications du cache souvent. Des éléments sont ajoutés lors de la classe.h/.m
fichiers sont ouverts et supprimé lorsque Xcode suspects, ils sont dépassées (au moins les plus âgés Xcodes se comporter comme cela). Lorsque vous enregistrez la table de montage séquentiel, le actuel version du cache est vidé, c'est pourquoi la<class>
souvent des modifications, voire disparaît.Je n'ai pas la rétro-ingénierie Xcode; j'ai fait ces observations, en expérimentant avec Xcode et storyboard fichiers. Néanmoins, je suis presque sûr à 100% qu'il fonctionne de cette façon.
Conclusions:
MyController1
- vue-contrôleur dans un storyboard document. Ouvrez la table de montage séquentiel du fichier, et de trouver quelque chose comme cela<viewController id=”ory-XY-OBM” sceneMemberID=”MyController1”>
.Vous pouvez en toute sécurité ne commettent que des changements dans la présente section et ignorer tout le reste. Si vous avez changé enchaîne ou contraintes, s'engagent également à tout ce qui a
“ory-XY-OBM”
à l'intérieur. Simple!C'est un bug dans XCode 4.5+, j'espère qu'elle est fixée, et oui ses un pain PITA.
Voici le plein de bug à Apple
Comment éviter Xcode gratuit des modifications au storyboard fichiers?
classes
section est ennuyeux, et je suis tout à fait pour dépôt bugs pour ce genre de choses, si oui ou non Apple ingénieurs d'accord. Le stockage de la version d'OS X qui a édité le fichier, cependant, est fou et certainement un bug. (Je peux voir comment l'Xcode version est pertinent. Version de l'OS, cependant, ne devrait rien avoir à faire avec elle.)Ce problème peut être quelque peu atténué par une utilisation judicieuse de
git add -p
sur l'un de Xcode est généré les fichiers, y compris des story-boards, XIBs, de Base des modèles de Données et des fichiers de projet, qui tous présentent les mêmes transitoires des modifications qui n'ont pas d'impact sur l'interface réelle/modèle/projet.Les plus courantes indésirable modifications que j'ai vu sur des story-boards sont les numéros de version (comme vous le mentionnez) et la constante ajout et la suppression de la
<classes>
section, l'omission de qui je n'ai jamais vu causer des problèmes. Pour XIBs, c'est l'ajout et la suppression de<reference key="NSWindow"/>
, qui n'est même pas une classe Cocoa Touch. Juste wow.Pensez-y comme à la mer: il est à la fois une haute et la marée basse. Laissez vous emporter.
Ahh. C'est tout.
Vous pouvez ignorer ces modifications lors de la mise en scène vos modifications, la réinitialisation de la jonque changements, et de faire un nettoyage de la validation.
Le seul avantage que j'ai vu avec les storyboards sur XIBs à partir d'un point de vue technique, c'est que Apple n'a pas encore castré FileMerge de refuser de fusionner en conflit story-boards. (FileMerge utilisé pour être en mesure de fusionner XIBs, mais des versions plus récentes a rompu. Thxxxx gars !!!)
Veuillez fichier de lots de bugs sur l'ensemble de ces problèmes à http://bugreporter.apple.com/! Et n'oubliez pas de créer des entrées sur OpenRadar.
Jeter sur une autre réponse ici, car cette situation s'est grandement améliorée. Le XML pour le fichier XIB que représente le StoryBoard a été grandement simplifiée.
J'ai aussi récemment mordu la balle et a commencé à utiliser l'interface dans Xcode au Contrôle de code Source. J'ai été sur la ligne de commande depuis des années et heureux, mais l'interface est agréable et il vous permet de fractionner les livraisons, ce qui est vraiment important si vous utilisez un système de billetterie que des liens vers engage.
De toute façon, j'ai remarqué aujourd'hui qu'il y a un changement sur le storyboard et les construit dans diff m'a montré que c'était un seul attribut dans la balise du document (systemVersion). Donc, pas une grosse affaire.
J'ai lu des articles où les gens disent SBs ont été mis hors la loi de leurs équipes en raison de la fusion de questions. Total de la folie. Ils sont tellement incroyables, surtout maintenant qu'ils ont mise en page automatique intelligent intégré, vous êtes vraiment absent dehors si vous ne les utilisez pas.
Il est utile de savoir pourquoi cette folie qui se passe, mais pour ceux qui croient en gardant leurs projets gratuitement des mises en garde et qui veulent juste un rapide et sale pour obtenir leurs projets de retour à un état sain:
Ne commettent pas de rien jusqu'à ce que la consigne explicite.
Ouvert Xcode et créer un nouveau storyboard (Commande+N > iOS > Interface Utilisateur > Storyboard). Je vais supposer que vous appelez le nom par défaut de
Storyboard.storyboard
.Ouvrir la table de montage que Xcode a violé. Je pars du principe que c'est
Base.lproj/Main.storyboard
.De sélectionner et de copier le tout sur la table de montage séquentiel (Commande+A Commande+C).
Ouvrir
Storyboard.storyboard
.De copier et de coller le tout dans
Storyboard.storyboard
.Près De Xcode.
Ouvrir un terminal et de modifier les répertoires de votre référentiel.
Remplacer
Main.storyboard
avecStoryboard.storyboard
(mv Storyboard.storyboard Base.lproj/Main.storyboard
).git add Base.lproj/Main.storyboard; git commit -m "Fix Xcode's insanity."
Annuler les changements de
project.pbxproj
viagit checkout -- project.pbxproj
. Si vousgit diff
le fichier, vous verrez qu'il vient d'ajouter de l'information à propos de nos temporaire d'un scénario (qui n'existe plus).Ouvrez Xcode sauvegarder et de voir que les mises en garde a disparu.
Respirer.