mercurial - मैं मर्कुरियल में प्रचार करने से कुछ संशोधनों को कैसे रख सकता हूं?




mercurial-queue (3)

मैं एक वेब डेटाबेस विकसित कर रहा हूं जो लगभग एक दर्जन अलग-अलग प्रतिष्ठानों के लिए उपयोग में है, जिनमें से अधिकांश मैं भी प्रबंधित करता हूं। प्रत्येक इंस्टॉलेशन में स्थानीय कॉन्फ़िगरेशन और कस्टमाइजेशन का एक निष्पक्ष बिट है। बस svn से मितव्ययिता के लिए स्विच करने के बाद, मैं स्थानीय संशोधनों का ट्रैक रखने के लिए अपनी वितरित प्रकृति का लाभ लेना चाहता हूं। मैंने प्रत्येक स्थापित सर्वर को अपनी स्वयं की रेपो के रूप में स्थापित किया है (और कॉन्फ़िगर एपाचे .hg निर्देशिका की सेवा नहीं करने के लिए)

मेरी कठिनाई यह है कि विकास के पेड़ में स्थानीय कॉन्फ़िगरेशन भी शामिल है, और मैं हर बिट को एक असंगत कॉन्फ़िग फ़ाइल में रखने से बचना चाहता हूं। तो, मैं मास्टर रिपो और स्थापित प्रतियों को स्थानीय कॉन्फ़िगरेशन का प्रचार करने से बचने के लिए कैसे चीजें सेट करूँ?

उदाहरण: मेरे पास एक लंबी config.ini फ़ाइल है जिसे संस्करण और वितरित किया जाना चाहिए। "साफ" संस्करण में डेटाबेस कनेक्शन मापदंडों के लिए प्लेसहोल्डर्स शामिल हैं, और मैं नहीं चाहता कि डेवलपमेंट सर्वर के पासवर्ड को स्थापित प्रतियों के लिए रिपॉजिटरी में समाप्त हो जाए। लेकिन अब और फिर मैं परिवर्तन करता हूँ (जैसे, नया चूक) मुझे प्रचार करने की आवश्यकता है। ऐसी ही स्थिति में कई फाइलें हैं

सबसे अच्छा मैं अब तक काम कर सकता है एमक स्थापित करने और स्थानीय संशोधनों को एक पैच (दो पैच, वास्तव में, तार्किक रूप से अलग बदलावों के साथ) में बदलना शामिल है। हर बार जब मैं स्थानीय रेपो में नियमित रूप से परिवर्तन करना चाहता हूं, तो मुझे सभी पैचों को पॉप करना, संशोधनों के लिए प्रतिबद्ध करना और पैच को फिर से लागू करना होगा। जब मैं मास्टर रिपो को पुश करने के लिए तैयार हूं, तो मुझे फिर से पैच पॉप, पुश करने और उन्हें फिर से लागू करना होगा। यह सब जटिल और त्रुटि प्रवण है।

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

संपादित करें: यहां सुझावों का पालन करने के बाद, मैं इस निष्कर्ष पर आ रहा हूं कि शाखाओं के नाम पर रिसाइज एक सरल और व्यावहारिक समाधान प्रदान करते हैं। मैंने अपने ही उत्तर के रूप में एक विवरण जोड़ लिया है कृपया देख लीजिये।


1 मर्कुरियल (टिप्पणियों के लिए अनुवर्ती) चयनात्मक (स्ट्रिंग-आधारित) कमिट - रिकॉर्ड एक्सटेंशन देखें

संस्करणित सार्वजनिक फ़ाइलों के अंदर 2 स्थानीय परिवर्तन एमक्यू एक्सटेंशन के साथ आसानी से प्राप्त हो सकते हैं (मैं इसे हर समय साइट-कॉन्फ़िग के लिए करता हूं) । एमक्यू के साथ आपका सिरदर्द

हर बार जब मैं स्थानीय रेपो में नियमित रूप से परिवर्तन करना चाहता हूं, तो मुझे सभी पैचों को पॉप करना, संशोधनों के लिए प्रतिबद्ध करना और पैच को फिर से लागू करना होगा। जब मैं मास्टर रिपो को पुश करने के लिए तैयार हूं, तो मुझे फिर से पैच पॉप, पुश करने और उन्हें फिर से लागू करना होगा।

पॉलिश वर्कफ़्लो और (कुछ) गलत व्याख्या का परिणाम नहीं है यदि आप बिना MQ-patches के लिए करना चाहते हैं - इसे हाथ से नहीं करें प्रतिबद्ध के लिए उपनाम जोड़ें, जो कि qop -all + commit और इस नए आदेश का उपयोग केवल। और जब आप पुश करते हैं, तो आप एमक्यू-स्टेट के बारे में चिंता न करें - आप रिपो से बदलावों को पुश करते हैं , डब्ल्यूसी स्टेट नहीं । स्थानीय रेपो को उप-प्रतिबद्ध हुक चेकिंग कंटेंट द्वारा उपनाम के बिना भी संरक्षित किया जा सकता है

3 आप स्थानीय शाखाएं एक्सटेंशन की कोशिश कर सकते हैं, जहां स्थानीय स्थानीय शाखाओं में आपके स्थानीय परिवर्तन संग्रहीत किए गए हैं (और शाखाओं में बदलावों को मिला दिया गया है) - मुझे एमक्यू की तुलना में इस तरह से अधिक परेशानी मिली


आपकी टिप्पणियों से, ऐसा लगता है कि आप इस से निपटने के लिए सबसे पहले अभ्यास से परिचित हैं: संस्करण एक कॉन्फ़िगरेशन टेम्प्लेट, और वास्तविक कॉन्फ़िगरेशन असत्य नहीं है।

लेकिन जब से आप उस समाधान से खुश नहीं हैं, तो यहां एक और प्रयास है जो आप कर सकते हैं:

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

हालांकि, अगर आपने परिवर्तनों को 1234 बना दिया है, जिसे आप कभी भी अन्य रिपॉजिटरी में नहीं लेना चाहते हैं, तो आप इसे मैन्युअल रूप से इसे इस तरह गुप्त के रूप में चिह्नित करके लागू कर सकते हैं:

hg phase --force --secret -r 1234

यदि आप फिर से किसी अन्य रिपॉजिटरी पर धकेलने की कोशिश करते हैं, तो इस चेतावनी से इसे अनदेखा कर दिया जाएगा:

pushing to http://example.com/some/other/repository
searching for changes
no changes found (ignored 1 secret changesets)

यह समाधान आपको अनुमति देता है

  1. संस्करण स्थानीय कॉन्फ़िगरेशन परिवर्तन
  2. उन परिवर्तनों को गलती से ढकने से रोकें
  3. अपने स्थानीय परिवर्तनों को अन्य परिवर्तनों के साथ मर्ज करें जो आप में खींचते हैं

बड़ा नकारात्मक पक्ष यह है कि आप इस गुप्त परिवर्तनों के शीर्ष पर बने परिवर्तनों को पुश नहीं कर सकते (क्योंकि यह गुप्त परिवर्तनों को साथ में धकेलता है)। इससे पहले कि आप उन्हें धक्का दे सकें, आपको इस तरह के बदलावों को पुन: दुबल करना होगा।


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

मैं कॉन्फ़िगरेशन जानकारी के लिए एक शाखा local उपयोग करता हूँ जब मेरे सभी रेपो चरणों का समर्थन करते हैं, तो मैं स्थानीय शाखा secret चिह्नित करता हूं; लेकिन विधि इसके बिना काम करती है। local default पर निर्भर है, लेकिन डिफ़ॉल्ट local पर निर्भर नहीं है, इसलिए इसे स्वतंत्र रूप से धक्का दिया जा सकता है ( hg push -r default )। यहां देखिए यह कैसे काम करता है:

  1. मान लीजिए विकास की मुख्य पंक्ति default शाखा में है। (आप अधिक शाखाएं कर सकते हैं, यह कंक्रीटेनेस के लिए है)। एक मास्टर (स्थिर) रेपो जिसमें पासवर्ड आदि शामिल नहीं हैं।

    ---o--o--o   (default)
    
  2. प्रत्येक परिनियोजित (गैर-विकास) क्लोन में, मैं एक शाखा local बनाता हूं और उसे सभी स्थानीय राज्यों को प्रतिबद्ध करता हूं।

    ...o--o--o   (default)
              \
               L--L    (local)
    
  3. अपस्ट्रीम से अपडेट हमेशा डिफ़ॉल्ट रूप से होंगे। जब भी मैं अपडेट खींचता हूं, मैं उन्हें local में मर्ज करता हूं ( n नए अपडेट का अनुक्रम होता है):

    ...o--o--o--n--n    (default)
              \     \
               L--L--N     (local)
    

    स्थानीय शाखा default के विकास को ट्रैक करती है, और अगर कुछ गलत हो जाता है तो मैं अभी भी पुराने कॉन्फ़िगरेशन पर वापस कर सकता हूं I

  4. विकास सर्वर पर, मैं एक ही सेट-अप के साथ शुरू होता हूँ: ऊपर की तरह कॉन्फ़िग सेटिंग्स के साथ एक local शाखा यह कभी भी धक्का नहीं दिया जाएगा। लेकिन local की नोक पर मैं एक तीसरी शाखा बना, dev यह वह जगह है जहां नया विकास होता है।

    ...o--o   (default)
           \
            L--L    (local)
                \
                 d--d--d     (dev)
    
  5. जब मैं मुख्य रिपॉजिटरी में कुछ विशेषताओं को प्रकाशित करने के लिए तैयार हूं, तो मैं पूरी dev शाखा को default की नोक पर दोबारा रिबेट करता हूं:

    hg rebase --source "min(branch('dev'))" --dest default --detach
    

    पिछले पेड़ बन जाता है:

    ...o--o--d--d--d   (default)
           \
            L--L    (local)
    

    रिसाइज्ड परिवर्तनसमूह अब शाखा default से संबंधित हैं। (फीचर शाखाओं के साथ, शाखा नाम को बनाए रखने के लिए --keepbranches कमांड में - --keepbranches जोड़ें)। नई सुविधाओं के पास अब local में कोई पूर्वजों नहीं है, और मैं उन्हें स्थानीय संशोधन के साथ खींचने के बिना push -r default साथ प्रकाशित कर सकता हूं। (कभी भी local default से मर्ज नहीं किया जा सकता default , केवल चारों ओर का रास्ता) यदि आप कहने के लिए भूल जाते हैं - पुश करने पर कोई समस्या नहीं, कोई समस्या नहीं: आपका धक्का अस्वीकार हो जाता है क्योंकि यह एक नया सिर जोड़ देगा

  6. विकास सर्वर पर, मैं रिश्वत संशोधनों को local रूप में मर्ज करता हूं जैसे कि मैं उन्हें खींचा होता हूं:

    ...o--o--d--d--d   (default)
           \        \
            L--L-----N    (local)
    
  7. अब मैं local शीर्ष पर एक नया dev शाखा बना सकता हूं, और विकास जारी रख सकता हूं।

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





mercurial-queue