Xcode के साथ Git का सही उपयोग कैसे करें?


94

मैं थोड़ी देर के लिए iPhone डेवलपर रहा हूं, और मुझे हाल ही में अपने वर्कफ़्लो में git शामिल किया गया है। मैंने अब तक अपने वर्कफ़्लो के लिए http://shanesbrain.net/2008/7/9/use-xcode-with-git पर पाई गई git सेटिंग्स का उपयोग किया है ।

उन सेटिंग्स git को मर्ज से * .pbxproj को बाहर करने के लिए कहते हैं? क्या ऐसा करने की असली वजह है? उदाहरण के लिए, जब मैं प्रोजेक्ट में कोई फ़ाइल जोड़ता हूं और मूल पर धकेलता हूं, तो मेरे साथी डेवलपर्स के पास उस फ़ाइल को उनके xcode प्रोजेक्ट में नहीं जोड़ा जाता जब वह खींचता है। फिर यदि उनमें से कोई एक रिलीज़ बनाता है तो यह फ़ाइल शामिल नहीं हो सकती है। क्या मुझे सिर्फ प्रोजेक्ट फाइल के लिए मर्ज को संभालने नहीं देना चाहिए? क्यों या क्यों नहीं इस फाइल को मर्ज में होना चाहिए और प्रोजेक्ट में फ़ाइलों को जोड़ने पर स्थिति को ठीक से कैसे संभालना है?


9
मैं XCode के साथ काम नहीं करता, लेकिन अगर * .pbxproj फाइलें कुछ भी हैं जैसे विजुअल स्टूडियो की * .csproj फाइलें (कुछ फाइलों की सूची) तो यह सेटिंग मेरे लिए मूर्खतापूर्ण लगती है। ऐसा लगता है कि किसी को मर्ज संघर्ष से थक गया था जब दो लोगों ने परियोजना में फाइलें जोड़ीं और सोचा कि सबसे अच्छा समाधान सब कुछ
खराब

XCode (विजुअल स्टूडियो के बारे में निश्चित नहीं) के साथ मुद्दा यह है कि .pbxproj फाइलें मुश्किल से मानव-पठनीय हैं, इसलिए यह हाथ से संघर्ष को हल करने का कोई मतलब नहीं है।
टॉम

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

जवाबों:


136

मैंने एसडीके लॉन्च के बाद से पूरे समय iPhone अनुप्रयोगों पर काम किया है, उस समय का अधिकांश समय कई डेवलपर्स के साथ टीमों पर काम करने में बिताया।

सच्चाई यह है कि यह .pbxproj फ़ाइल को मर्ज करने में मदद करने से अधिक हानिकारक है। जैसा कि आप कहते हैं, जब आप एक फ़ाइल जोड़ते हैं जब तक कि अन्य लोगों को वह फ़ाइल नहीं मिलती है, तो उन्हें इसे अपनी परियोजना में भी जोड़ना होगा - किसी भी आकार के आवेदन में, यह बेकार है और इसमें स्रोत कोड नियंत्रण का एक बड़ा लाभ भी है वास्तव में सिर्फ git के माध्यम से एक पूर्ण पहले परियोजना की स्थिति में वापस नहीं आ सकता है।

.Pbxproj फ़ाइल बस एक संपत्ति सूची (XML के समान) है। अनुभव से, बस केवल मर्ज संघर्ष के बारे में आप कभी भी मिल रहे थे यदि दो लोगों ने एक ही समय में फाइलें जोड़ी हैं। मर्ज संघर्ष मामलों के 99% में समाधान मर्ज के दोनों किनारों को रखने के लिए है, जो कम से कम बस के लिए किसी भी >>>>, <<<<, और ==== लाइनों को हटाने शामिल है। वास्तव में यह इतना सामान्य है कि मैंने git से एक मर्ज अवस्था में .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

सबसे खराब स्थिति यदि यह विफल हो जाता है (आप XCode को प्रोजेक्ट लोड करने के लिए कहते हैं और यह लोड करने में विफल रहता है), तो आप बस .pbxproj फ़ाइल को हटा दें, मास्टर को गिट से जांचें, और अपनी फ़ाइलों को फिर से जोड़ें। लेकिन मैं इस स्क्रिप्ट के साथ कई महीनों के उपयोग में कभी नहीं हुआ, फिर से कई अन्य डेवलपर्स के साथ iPhone अनुप्रयोगों पर पूर्णकालिक काम कर रहा हूं।

एक अन्य विकल्प (नीचे टिप्पणियों में इंगित किया गया है) जिसे आप स्क्रिप्ट के स्थान पर उपयोग करने का प्रयास कर सकते हैं, इस पंक्ति को .gitattributven फ़ाइल में जोड़ना है:

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

फिर git हमेशा .pbxproject फ़ाइलों के लिए एक मर्ज के दोनों किनारों को ले जाएगा, उसी स्क्रिप्ट के समान प्रभाव वाले जो मैंने बिना किसी अतिरिक्त काम के प्रदान किए।

अंत में, यहाँ मेरी पूरी .gitignore फ़ाइल है, जो दिखाती है कि मैंने इसे अनदेखा करने के लिए सेट कर दिया है क्योंकि कुछ चीजें हैं जो आप नहीं चाहते हैं - मेरे मामले में वास्तव में अवशेष और पूरे बिल्ड निर्देशिका को खाली करता है:

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

# old skool
.svn

# osx noise
.DS_Store
profile

3
क्या आप अपने .कोड प्रोजेक्ट के लिए .gitattributes फ़ाइल का उपयोग करते हैं? और आपकी जानकारी के लिए धन्यवाद। मुझे लगता है कि भविष्य में pbxproj फ़ाइलों को मर्ज करने का प्रयास करना बहुत आसान होगा।
रिक्शारिसन

1
आज तक हम नहीं रहे हैं, हालांकि उस के कुछ पहलू दिलचस्प दिखते हैं - लेकिन जिन लोगों के साथ मैंने काम किया है वे उन्नत गिट उपयोगकर्ता नहीं हैं, और इसलिए उन्नत सुविधाओं की सलाह मजबूत नहीं है।
केंडल हेल्मसटेटर गेलनर

1
".Pbxproj फ़ाइल केवल JSON (XML के समान) है।" दरअसल, यह एक ओपनस्टेप-स्वरूपित संपत्ति सूची है। JSON के रूप में एक ही मूल विचार, लेकिन वाक्यविन्यास कुछ स्थानों में भिन्न होता है।
पीटर होसी

1
प्रयास करने के लिए एक और चीज़ - सेट मर्ज = संघ: stackoverflow.com/questions/2729109/…
केंडल हेल्मेट्टर गेलर

1
मैं आपकी स्क्रिप्ट चलाने के बजाय @KendallHelmstetterGelner से सहमत हूं, जो उन विशेष पंक्तियों को हटा देता है, आप unionस्विच के साथ अपने *.pbxproj text/plain -crlf -diff -merge union
बेसि

9

यह मेरे लिए Xcode 4.6 और Git 1.7.5 में काम करता है।

इसके साथ .ITattributes फ़ाइल जोड़ें और प्रतिबद्ध करें:

*.pbxproj binary merge=union

मैंने एक अन्य टीम के सदस्य के साथ इसका परीक्षण किया है और महान काम करता है।

इससे लिया गया: http://robots.thoughtbot.com/post/33796217972/xcode-and-git-bridging-the-gap


मर्ज = मिलन अच्छा है लेकिन मर्जपॉब टूल स्वीकृत उत्तर होना चाहिए।
Alper

8

सच कहें तो मौजूदा जवाब भ्रामक हैं।

यदि आप फ़ाइलों को कभी भी डिलीट या रीनेम नहीं करते हैं, तो merge=unionरणनीति का उपयोग करना , जो कि सीधे अलग-अलग कमिट में अंतरों को जोड़ती है, एक अच्छा विचार है।

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

अब तक मुझे मिला सबसे अच्छा समाधान:

1) परियोजना को अच्छी तरह से डिज़ाइन करें और शुरुआत में सभी आवश्यक फ़ाइलों को जोड़ें, ताकि आप शायद ही कभी इसे बदलने की आवश्यकता हो project.pbxproj

2) अपनी सुविधाओं को छोटा करें। एक शाखा में बहुत सारे काम न करें।

3) किसी भी कारण से, यदि आपको फ़ाइल संरचना को संशोधित करने और विवादों project.pbxprojको हल करने की आवश्यकता है, तो अपने पसंदीदा पाठ संपादक का उपयोग मैन्युअल रूप से हल करने के लिए करें। जैसा कि आप अपने कार्यों को छोटा करते हैं, संघर्षों को हल करना आसान हो सकता है।


3

संक्षिप्त उत्तर यह है कि यदि आप उस पंक्ति को शामिल नहीं करते हैं .gitattributes, तो भी आप एक .pbxproj के दो संशोधित संस्करणों को आसानी से विलय करने में सक्षम नहीं हो सकते हैं। गिट के लिए इसे द्विआधारी के रूप में व्यवहार करना बेहतर है।

विवरण के लिए यहां देखें: Git और pbxproj

अद्यतन: भले ही गिट बुक अभी भी इस जवाब से सहमत है , मैं अब नहीं करता। मैं .pbxprojकिसी अन्य गैर-बाइनरी स्रोत फ़ाइल की तरह अपने संस्करण को नियंत्रित करता हूं ।


ऐसा लगता है कि आप फ़ाइल simplejsonको इंडेक्स के रास्ते में फ़ाइल या कुछ टिडियर के माध्यम से भेजने के लिए एक कमिट फ़िल्टर स्थापित कर सकते हैं । हालांकि यह अभी भी काम करने की गारंटी नहीं होगी।
intuited

1
यह एक JSON स्वरूपित फ़ाइल नहीं है। समान दिखता है लेकिन विस्तार में कई अंतर हैं।
eonil

यह कहता है कि इसका JSON git पुस्तक में है, लेकिन ऐसा लगता है कि यह गलत है। git-scm.com/book/ch7-2.html
huggie

1
ठीक है। .pbxprojफ़ाइल वास्तव में एक पुरानी शैली NeXT / कोको PList फ़ाइल है, जो पुरानी है, और JSON से बहुत पहले परिभाषित की गई है, और अब Apple द्वारा पदावनत की गई है। (लेकिन वे अभी भी कुछ स्थानों पर इसका उपयोग कर रहे हैं) पुस्तक में फ़ाइल के बारे में उल्लेख पूरी तरह से गलत है। मैंने वोट हटा दिया क्योंकि आपने इसका स्पष्ट उल्लेख किया था।
eonil

2

मैंने एक पायथन स्क्रिप्ट बनाई जो XCode प्रोजेक्ट फ़ाइलों में मर्ज विरोधों को संभाल सकती है।

यदि आप इसे आज़माना चाहते हैं, तो आप इसे यहाँ देख सकते हैं: https://github.com/simonwagner/mergepbx

आपको इसे मर्ज ड्राइवर के रूप में स्थापित करना होगा, इसलिए यह स्वचालित रूप से तब हो जाता है जब आपके प्रोजेक्ट फ़ाइल में मर्ज संघर्ष होता है (README.md आपको बताएगा कि यह कैसे करना है)।

यह आपके प्रोजेक्ट फ़ाइल के शब्दार्थों merge=unionको mergepbxसमझने की तुलना में बेहतर तरीके से काम करना चाहिए और इसलिए संघर्ष को सही ढंग से हल करेगा।

हालाँकि यह परियोजना अभी भी अल्फ़ा है, उम्मीद नहीं है कि यह हर प्रोजेक्ट फ़ाइल को समझने के लिए है जो वहाँ है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.