2012-11-05 43 views
122

स्टोरीबोर्ड एक गिट वर्कफ़्लो परिप्रेक्ष्य से शाही दर्द होते हैं जब कई लोग उन पर सहयोग कर रहे हैं। उदाहरण के लिए, .storyboard फ़ाइल में एक्सएमएल ने <document> टैग की toolsVersion और systemVersion गुणों को बदल दिया है जो कि हालिया फ़ाइल मैनिपुलेटर चल रहा है, जो भी कॉन्फ़िगरेशन द्वारा बदला गया है। सभी के एक्सकोड संस्करणों को सिंक्रनाइज़ करना ठीक से toolsVersion के साथ मदद करता है, लेकिन systemVersion कोई फर्क नहीं पड़ता कि डेवलपर चल रहे विशिष्ट मैक और/या ओएस एक्स संस्करण के आधार पर कोई फर्क नहीं पड़ता।एक्सकोड अनमोडिफाइड स्टोरीबोर्ड और एक्सआईबी फाइलों को बदलता है

यह मूर्खतापूर्ण है, लेकिन अधिकतर हानिरहित है। हालांकि, हमें चिंता है कि दूसरी बार कुछ अन्य बदलाव स्वचालित रूप से git pull के बाद उन्हें खोलकर स्टोरीबोर्ड पर किए जाते हैं। ऐसा कहने के लिए, ऐलिस एक स्टोरीबोर्ड में बदलाव करता है, करता है और उन्हें भंडार में धक्का देता है। बॉब फिर एलिस के बदलाव खींचता है और आगे के बदलाव करने के लिए स्टोरीबोर्ड खोलता है। जिस क्षण वह स्टोरीबोर्ड खोलता है, फ़ाइल आइकन तुरंत संशोधित-लेकिन-सहेजे गए राज्य में बदल जाता है, और git status दिखाता है कि किसी भी अजीब बदलाव हुए हैं। बॉब के बिना यह सब कुछ बदल गया है या फ़ाइल खुद को बचाया है।

हम देख रहे सबसे आम स्वचालित परिवर्तन एक स्टोरीबोर्ड फ़ाइल के अंत में पूरे <classes> टैग हाइराची का गायब या पुन: प्रकट होना है। हमने यह नहीं पता लगाया कि इसका क्या कारण है। हमारे पास विभिन्न .lproj निर्देशिकाओं में स्टोरीबोर्ड के कई स्थानीय संस्करण हो सकते हैं, और इंटरफ़ेस बिल्डर के अंदर उन्हें खोलते समय, श्रेणी पदानुक्रम को कुछ से हटा दिया जा सकता है और दूसरों में जोड़ा जा सकता है, या कुछ में अकेला छोड़ दिया जा सकता है। यह git diff में बहुत शोर का कारण बनता है, लेकिन यह वास्तव में किसी भी कार्यक्षमता को तोड़ नहीं देता है। हम अक्सर गिट के इंडेक्स में किए गए वास्तविक परिवर्तनों को चुनिंदा रूप से जोड़ते हैं, उन्हें प्रतिबद्ध करते हैं, और फिर केवल सहज, गैरकानूनी <classes> परिवर्तनों को त्याग देते हैं। यह छोटे और अच्छे काम करता है, जैसा कि होना चाहिए। आखिरकार, हालांकि, यह परेशान करने के लिए बहुत अधिक हो जाता है क्योंकि एक्सकोड बदलावों को फिर से कर रहा है, और कोई भी उन्हें किसी अन्य सामान के साथ ragecommits ... जो ठीक है जब तक किसी और के Xcode उन्हें वापस बदलने के लिए उन्हें बदलने के लिए फैसला स्पष्ट कारण। (हमारे प्रतिबद्ध इतिहास में इस पर बहुत अधिक शपथ है।)

क्या कोई और इस व्यवहार को देख रहा है? क्या यह हमारे एक या अधिक डेवलपर मैक पर एक एक्सकोड बग या कॉन्फ़िगरेशन समस्या है? XIB फ़ाइलों के साथ सहयोग करते समय हमने कुछ समान व्यवहार देखा है, लेकिन स्टोरीबोर्ड इस पर अधिक संवेदनशील लगते हैं।

+0

वास्तव में एक्सकोड परियोजनाएं और गिट एक साथ बहुत अच्छी तरह से नहीं कर रहे हैं। मुझे नहीं लगता कि आप अनावश्यक परिवर्तनों को छोड़ने के अलावा इस गड़बड़ी से अन्य तरीकों से बच सकते हैं - जो कि लगभग हमेशा परियोजना फाइलें मेरे और अन्य एक्सएमएल फाइलों के लिए बदलती हैं, मुझे यकीन है कि मैंने नहीं बदला है। अगर कोई समाधान 'समाधान' है तो खुशी होगी।मुझे सुविधाजनक लॉक कार्यक्षमता के लिए पर्सफोर्स पसंद है जो एक्सकोड को बहुत अधिक बदलने की इजाजत नहीं देता है, शायद उन फ़ाइलों के लिए मैन्युअल रूप से किया जा सकता है जिन्हें आप बदलने वाले नहीं हैं बल्कि केवल समीक्षा के लिए। –

+3

गिट या कुछ और के साथ स्टोरीबोर्ड का उपयोग करने लायक नहीं है। वे दोस्ताना प्रतिबद्ध होने के लिए डिज़ाइन नहीं किए गए हैं। हमने छोड़ दिया और .xib के साथ चला गया जो कि महान नहीं है लेकिन कम से कम यह दानेदार है। – ahwulf

+0

हमने स्टोरीबोर्ड को वास्तव में बहुत सी चीजों के लिए बहुत साफ पाया है, हालांकि उन्हें अक्सर XIB के साथ मिश्रण करना आवश्यक है। अगर यह बग कभी तय हो जाता है, तो हम उस समय के विशाल बहुमत के साथ काम करने में काफी खुश होंगे। –

उत्तर

73

यह एक बग नहीं है, यह एक परिणाम है कि कैसे एक्सकोड स्टोरीबोर्ड फ़ाइलों को संसाधित करता है। मैं स्टोरीबोर्ड फाइलों के लिए एक diff और विलय प्रोग्राम लिख रहा हूं (GitHub link) और मैंने स्टोरीबोर्ड फाइल तर्क का विश्लेषण करने और एक्सकोड को कैसे संसाधित किया है इसका विश्लेषण करने में कई घंटे बिताए हैं।

  • क्यों अजीब परिवर्तन स्टोरीबोर्ड फाइलों में होते हैं: यह है कि मैं क्या खोज की है? एक्सकोड कुछ NSSet-आधारित लॉजिकल पेड़ संरचना में स्टोरीबोर्ड फ़ाइलों को पार्स करने के लिए एनएसएक्सएमएल एपीआई का उपयोग करता है। जब एक्सकोड को परिवर्तन लिखने की आवश्यकता होती है तो यह तार्किक वृक्ष संरचना के आधार पर NSXMLDocument बनाता है, स्टोरीबोर्ड फ़ाइल को साफ़ करता है और फ़ाइल को फिर से भरने के लिए XMLDataWithOptions: पर कॉल करता है। चूंकि सेट उनके तत्वों के क्रम को संरक्षित नहीं करते हैं, यहां तक ​​कि मामूली संशोधन भी संपूर्ण स्टोरीबोर्ड एक्सएमएल फ़ाइल को बदल सकता है।

  • कक्षा टैग गायब हो जाता है या यादृच्छिक रूप से क्यों दिखाई देता है? <class> अनुभाग एक आंतरिक एक्सकोड कैश से अधिक कुछ नहीं है। एक्सकोड कक्षाओं के बारे में जानकारी कैश करने के लिए इसका इस्तेमाल करते हैं। कैश अक्सर बदलता है। एलिमेंट्स जोड़े जाते हैं जब कक्षा .h/.m फ़ाइलों को खोला जाता है और हटा दिया जाता है जब एक्सकोड संदिग्ध वे पुराने होते हैं (कम से कम पुराने एक्सकोड इस तरह व्यवहार करते हैं)। जब आप स्टोरीबोर्ड को सहेजते हैं, तो कैश के वर्तमान संस्करण को डंप किया जाता है, यही कारण है कि <class> अनुभाग अक्सर बदलता या गायब हो जाता है।

मैंने एक्सकोड को रिवर्स-इंजीनियर नहीं किया है; मैंने एक्सकोड और स्टोरीबोर्ड फाइलों के प्रयोग से इन अवलोकनों को बनाया। फिर भी, मुझे लगभग 100% यकीन है कि यह इस तरह से काम करता है।

निष्कर्ष:

  • कैश अनुभाग महत्वहीन है, आप इसमें किसी भी बदलाव को सुरक्षित रूप से अनदेखा कर सकते हैं।
  • सभी मंचों पर आप जो पा सकते हैं उसके विपरीत, स्टोरीबोर्ड फ़ाइलों को विलय करना एक जटिल कार्य नहीं है। उदाहरण के लिए, मान लीजिए कि आपने स्टोरीबोर्ड दस्तावेज़ में MyController1 व्यू कंट्रोलर बदल दिया है। स्टोरीबोर्ड फ़ाइल खोलें, और इस <viewController id=”ory-XY-OBM” sceneMemberID=”MyController1”> जैसे कुछ ढूंढें। आप सुरक्षित रूप से इस खंड में केवल परिवर्तन कर सकते हैं और बाकी सब कुछ अनदेखा कर सकते हैं। यदि आपने सीग्स या बाधाओं को बदल दिया है, तो कुछ भी ऐसा करें जो “ory-XY-OBM” अंदर है। सरल!
+7

एक्सकोड diff/विलय उपकरण पर कोई अद्यतन? लगता है जैसे यह इस समुदाय के लिए बहुत उपयोगी होगा। – Tony

+1

आप ऐप को मेरे वेब पेज से प्राप्त कर सकते हैं (प्रोफ़ाइल देखें)। ऐप 100% मुफ़्त है। –

+0

मैं स्टोरीबोर्ड को यथासंभव विभाजित करने की भी सिफारिश करता हूं। –

17

यह एक्सकोड 4.5+ में एक बग है, मुझे उम्मीद है कि यह ठीक हो जाएगा, और हाँ यह एक पिटा है।

यहाँ एप्पल

How to avoid Xcode gratuitous edits to storyboard files?

+0

मेरे पास 4.4 – jere

+1

में भी यह 4.6 था। शायद यह एक बग नहीं है। – Thromordyn

+0

4.6.3 अभी भी है। यह नहीं कह सकता कि स्टोरीबोर्ड/xibs ने कभी भी अच्छी तरह से काम किया है, हालांकि – houbysoft

11

पर पूर्ण बग यह समस्या Xcode के उत्पन्न स्टोरीबोर्ड, XIBs, कोर डाटा मॉडल, और परियोजना फ़ाइलों सहित फ़ाइलें, में से किसी पर git add -p के अत्यंत विवेकपूर्ण उपयोग से कुछ हद तक कम किया जा सकता है , जिनमें से सभी समान क्षणिक संशोधनों से ग्रस्त हैं जिनके वास्तविक इंटरफ़ेस/मॉडल/प्रोजेक्ट पर कोई प्रभाव नहीं पड़ता है।

स्टोरीबोर्ड पर मैंने देखा है कि सबसे आम जंक परिवर्तन सिस्टम संस्करण संख्या (जैसा कि आप उल्लेख करते हैं) और निरंतर जोड़ और <classes> अनुभाग को हटाने के लिए, जिसकी वजह से मैंने कभी भी समस्याएं नहीं देखी हैं। XIB के लिए, यह <reference key="NSWindow"/> का जोड़ा और निकालना है, जो कोको टच में भी एक वर्ग नहीं है। बस वाह।

समुद्र के बारे में सोचें: वहां एक उच्च और निम्न ज्वार है। इसे आप पर धोने दें।

अहह। बस।

आप अपने परिवर्तनों को व्यवस्थित करते समय इन परिवर्तनों को अनदेखा कर सकते हैं, जंक परिवर्तनों को रीसेट कर सकते हैं, और एक साफ प्रतिबद्ध कर सकते हैं।

एक तकनीकी दृष्टिकोण से XIB पर स्टोरीबोर्ड के साथ मैंने जो एकल लाभ देखा है, वह यह है कि ऐप्पल ने अभी तक फ़ाइलमेज को विवादित स्टोरीबोर्ड मर्ज करने से इनकार करने के लिए नियुक्त नहीं किया है। (FileMerge XIB को मर्ज करने में सक्षम होता था, लेकिन नए संस्करणों ने इसे तोड़ दिया। Thxxxx दोस्तों !!!)

http://bugreporter.apple.com/ पर इन सभी समस्याओं के बारे में बहुत सारी बग दर्ज करें! और OpenRadar पर प्रविष्टियां बनाना न भूलें।

5

यहां एक और उत्तर फेंकना क्योंकि इस स्थिति में काफी सुधार हुआ है। स्टोरीबोर्ड का प्रतिनिधित्व करने वाली एक्सआईबी फ़ाइल के लिए एक्सएमएल बहुत सरल बना दिया गया है।

मैंने हाल ही में बुलेट काट दिया है और एक्सकोड में सोर्स कंट्रोल में इंटरफ़ेस का उपयोग करना शुरू कर दिया है। मैं वर्षों से कमांड लाइन पर रहा हूं और वहां खुश हूं, लेकिन इंटरफ़ेस अच्छा है और यह आपको कामों को विभाजित करने देता है, जो वास्तव में महत्वपूर्ण है यदि आप टिकटिंग सिस्टम का उपयोग करते हैं जो काम करने के लिए लिंक करता है।

वैसे भी, मैंने आज देखा कि स्टोरीबोर्ड पर एक बदलाव आया था और अंतर्निहित डिफ ने मुझे दिखाया कि यह दस्तावेज़ टैग (सिस्टमवर्सन) में एक ही विशेषता थी। तो एक बड़ा सौदा नहीं है।

मैंने लेख पढ़े हैं जहां लोग कहते हैं कि समस्याओं को विलय करने के कारण एसबी को उनकी टीमों पर अवैध रूप से रोक दिया गया था। कुल पागलपन वे इतने आश्चर्यजनक हैं, खासकर अब जब उनके पास बुद्धिमान ऑटोलायआउट बनाया गया है, तो आप वास्तव में अनुपलब्ध हैं यदि आप उनका उपयोग नहीं कर रहे हैं।

3

यह जानना इस पागलपन क्यों हो रहा है मददगार है, लेकिन जो लोग उनकी परियोजनाओं चेतावनी से मुक्त रखने और उन पर विश्वास करते हैं के लिए बस एक त्वरित और गंदा उनकी परियोजनाओं के लिए एक स्वस्थ राज्य को वापस पाने के लिए चाहते हैं:

  1. स्पष्ट रूप से निर्देश दिए जाने तक कुछ भी न करें।

  2. ओपन एक्सकोड खोलें और एक नया स्टोरीबोर्ड बनाएं (कमांड + एन> आईओएस> यूजर इंटरफेस> स्टोरीबोर्ड)। मुझे लगता है कि आप इसे Storyboard.storyboard का डिफ़ॉल्ट नाम कहते हैं।

  3. एक्सकोड का उल्लंघन करने वाले स्टोरीबोर्ड को खोलें। मुझे लगता है कि यह Base.lproj/Main.storyboard है।

  4. स्टोरीबोर्ड पर सबकुछ चुनें और कॉपी करें (कमांड + ए फिर कमांड + सी)।

  5. ओपन Storyboard.storyboard

  6. सबकुछ Storyboard.storyboard में कॉपी और पेस्ट करें।

  7. बंद एक्सकोड।

  8. टर्मिनल खोलें और अपनी रिपॉजिटरी में निर्देशिका बदलें।

  9. Main.storyboardStoryboard.storyboard (mv Storyboard.storyboard Base.lproj/Main.storyboard) के साथ बदलें।

  10. git add Base.lproj/Main.storyboard; git commit -m "Fix Xcode's insanity."

  11. उपेक्षा project.pbxproj में परिवर्तन git checkout -- project.pbxproj के माध्यम से। यदि आप फ़ाइल को git diff फ़ाइल देखते हैं, तो आप देखेंगे कि उसने अभी हमारे अस्थायी स्टोरीबोर्ड (जो अब मौजूद नहीं है) के बारे में जानकारी जोड़ दी है।

  12. ओपन एक्सकोड बैक अप और देखें कि चेतावनियां गायब हो गई हैं।

  13. सांस।