iphone - XCode के साथ गिट का सही तरीके से उपयोग कैसे करें?
objective-c git (4)
मैं थोड़ी देर के लिए एक आईफोन डेवलपर रहा हूं, और हाल ही में मैंने अपने वर्कफ़्लो में गिट भी शामिल किया है। मैंने अब तक अपने वर्कफ़्लो के लिए http://shanesbrain.net/2008/7/9/using-xcode-with-git पर मिली गिट सेटिंग्स का उपयोग किया है।
उन सेटिंग्स विलय से * .pbxproj को बाहर करने के लिए गिट बताते हैं? क्या ऐसा करने का कोई वास्तविक कारण है? उदाहरण के लिए, जब मैं प्रोजेक्ट में एक फ़ाइल जोड़ता हूं और मूल पर धक्का देता हूं, तो मेरे साथी डेवलपर्स को उस फ़ाइल को उनके एक्सकोड प्रोजेक्ट में तब नहीं जोड़ा जाएगा जब वे खींचते हैं। फिर यदि उनमें से एक रिलीज बनाता है तो इस फ़ाइल को शामिल नहीं किया जा सकता है। क्या मुझे सिर्फ परियोजना फाइल के लिए विलय को विलय नहीं करना चाहिए? क्या कोई यह बता सकता है कि इस फ़ाइल में विलय में क्यों होना चाहिए या क्यों नहीं और परियोजना में फ़ाइलों को जोड़े जाने पर स्थिति को सही तरीके से कैसे संभालना चाहिए। धन्यवाद।
मैंने एक पायथन स्क्रिप्ट बनाई है जो एक्सकोड प्रोजेक्ट फ़ाइलों में विलय विवादों को संभाल सकता है।
यदि आप इसे आजमा सकते हैं, तो आप इसे यहां देख सकते हैं: https://github.com/simonwagner/mergepbx
आपको इसे एक मर्ज ड्राइवर के रूप में स्थापित करना होगा, इसलिए जब आप अपनी प्रोजेक्ट फ़ाइल में विलय विवाद करते हैं तो इसे स्वचालित रूप से कॉल किया जाता है (README.md आपको बताएगा कि यह कैसे करें)।
इसे merge=union
का उपयोग merge=union
से बहुत बेहतर काम करना चाहिए क्योंकि mergepbx
आपकी प्रोजेक्ट फ़ाइल के अर्थशास्त्र को समझता है और इसलिए संघर्ष को सही तरीके से हल करेगा।
हालांकि परियोजना अभी भी अल्फा है, उम्मीद है कि यह वहां मौजूद प्रत्येक प्रोजेक्ट फ़ाइल को समझने की उम्मीद न करें।
मैंने एसडीके लॉन्च के बाद से पूर्णकालिक आईफोन अनुप्रयोगों पर काम किया है, उस समय के अधिकांश ने कई डेवलपर्स के साथ टीमों पर काम किया।
सच्चाई यह है कि यह उस .pbxproj फ़ाइल के विलय को अस्वीकार करने के लिए और अधिक हानिकारक है, इससे मददगार है। जैसा कि आप कहते हैं, जब आप अन्य फाइलों को तब तक फ़ाइल जोड़ते हैं जब तक कि अन्य लोगों को वह फ़ाइल न मिल जाए, उन्हें किसी भी आकार के आवेदन में इसे जोड़ना होगा, जो बेकार है और यह भी आपको स्रोत कोड नियंत्रण का एक बड़ा लाभ लेता है वास्तव में गिट के माध्यम से पूरी तरह से पहले परियोजना राज्य में वापस नहीं जा सकते हैं।
.pbxproj फ़ाइल बस एक संपत्ति सूची है (एक्सएमएल के समान)। अनुभव से, केवल विलय विवाद के बारे में आप कभी भी प्राप्त कर सकते हैं यदि दो लोगों ने एक ही समय में फाइलें जोड़ दी हैं। मर्ज विवाद के 99% मामलों में समाधान विलय के दोनों पक्षों को रखना है, जो गिट के लिए कम से कम किसी भी >>>>, <<<<, और ==== लाइनों को हटाने में शामिल है। असल में यह इतना आम है कि मैंने गिट से एक विलय स्थिति में .pbxproj फ़ाइल को ठीक करने के लिए एक सरल खोल स्क्रिप्ट बनाई है, मैं इसे प्रोजेक्ट निर्देशिका (कक्षा स्तर पर) से चलाता हूं:
#!/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
सबसे खराब मामला अगर यह विफल हो जाता है (आप एक्सकोड को प्रोजेक्ट लोड करने के लिए कहते हैं और यह लोड करने में विफल रहता है), तो आप बस .pbxproj फ़ाइल को हटा दें, गिट से मास्टर को देखें, और अपनी फाइलें दोबारा जोड़ें। लेकिन मैंने कभी भी इस स्क्रिप्ट के साथ कई महीनों के उपयोग में ऐसा नहीं किया है, फिर भी कई अन्य डेवलपर्स के साथ आईफोन अनुप्रयोगों पर पूर्णकालिक काम कर रहा हूं।
एक और विकल्प (नीचे टिप्पणियों में बताया गया है) कि आप स्क्रिप्ट के स्थान पर उपयोग करने का प्रयास कर सकते हैं, इस लाइन को .gitattributes फ़ाइल में जोड़ना है:
*.pbxproj text -crlf -diff -merge=union
फिर गिट हमेशा .pbxproject फ़ाइलों के लिए विलय के दोनों तरफ ले जाएगा, जिस तरह से स्क्रिप्ट मैंने केवल अतिरिक्त काम किए बिना प्रदान किया है।
आखिरकार, मेरी पूरी .gitignore फ़ाइल है, जो दिखाती है कि मैंने जो कुछ किया है उसे अनदेखा करने के लिए सेट किया गया है क्योंकि कुछ ऐसी चीजें हैं जिन्हें आप नहीं चाहते हैं - मेरे मामले में वास्तव में केवल अवशेष और पूरी बिल्ड निर्देशिका को emacs:
# xcode noise
build/*
*.pbxuser
*.mode1v3
*~
# old skool
.svn
# osx noise
.DS_Store
profile
संक्षिप्त जवाब यह है कि यदि आप उस लाइन को .gitattributes
में शामिल नहीं करते हैं, तो भी आप .gitattributes
दो संशोधित संस्करणों को आसानी से मर्ज करने में सक्षम नहीं हो सकते हैं। गिट के लिए इसे बाइनरी के रूप में इलाज करना बेहतर है।
विवरण के लिए यहां देखें: गिट और पीबीएक्सप्रोजेज
अद्यतन: भले ही गिट बुक अभी भी इस उत्तर से सहमत है , मैं अब नहीं करता हूं। मैं संस्करण .pbxproj
को किसी भी अन्य गैर-बाइनरी स्रोत फ़ाइल की तरह नियंत्रित करता हूं।
स्पष्ट रूप से, मौजूदा उत्तर भ्रामक हैं।
यदि आप फ़ाइलों को कभी भी हटा या नाम नहीं देते हैं , तो merge=union
रणनीति का उपयोग करते हुए, जो कि अलग-अलग कामों में अंतर को जोड़ता है, एक अच्छा विचार है।
हालांकि, वास्तविक दुनिया में, हमें कभी-कभी फ़ाइलों को हटाने या नाम बदलने की आवश्यकता होती है। बिना किसी संशोधन के मतभेदों को विलय करने से इन परिस्थितियों में बहुत सारी समस्याएं पैदा हो जाएंगी, और ये समस्याएं आमतौर पर "वर्कस्पेस इंटेग्रिटी - प्रोजेक्ट लोड नहीं कर सकती" समस्या का कारण बनती हैं, जिससे आप परियोजना को चलाने में भी सक्षम नहीं होते हैं।
अब तक का सबसे अच्छा समाधान मिला है:
1) परियोजना को अच्छी तरह डिज़ाइन करें और शुरुआत में सभी आवश्यक फाइलें जोड़ें, इसलिए आपको शायद ही कभी project.pbxproj
को बदलने की आवश्यकता होगी।
2) अपनी सुविधाओं को छोटा बनाओ। एक शाखा में बहुत सी चीजें मत करो।
3) किसी भी कारण से, यदि आपको फ़ाइल संरचना को संशोधित करने और project.pbxproj
में संघर्ष प्राप्त करने की आवश्यकता है, तो उन्हें मैन्युअल रूप से हल करने के लिए अपने पसंदीदा टेक्स्ट एडिटर का उपयोग करें। जैसे ही आप अपने कार्यों को छोटा बनाते हैं, संघर्ष सुलझाने में आसान हो सकते हैं।