2012-03-09 14 views
5

Mercurial का उपयोग करके, मैं में गुप्त परिवर्तनों सहित किसी अन्य भंडार में ज्ञात सभी परिवर्तनों को कैसे बंडल कर सकता हूं?Mercurial: बंडल में गुप्त परिवर्तन शामिल करें?

मुझे पता है bundle का --base विकल्प गुप्त परिवर्तनों को शामिल करने के लिए होता है, लेकिन मुझे --base व्यवहार नहीं चाहिए। (और यह असामान्य रूप से अजीब लगता है कि गुप्त changesets हमेशा हैं --base साथ शामिल है लेकिन कभी नहीं इसके बिना शामिल कर रहे हैं। वहाँ एक अलग विकल्प हो नहीं करना चाहिए?)

FYI करें, मैं आमतौर पर सभी का बैकअप बनाना चाहते परिवर्तन जो संभावित रूप से खतरनाक इतिहास को फिर से लिखने से पहले मेरे स्थानीय रेपो में हैं।

+0

शायद ** ** ** इतिहास को फिर से लिखना नहीं है? –

+0

'एचजी मदद चरण '- गुप्त परिवर्तन न तो धक्का, खींचा या क्लोन किया जाता है –

उत्तर

5

आप सही हैं कि hg bundle सामान्य रूप से गुप्त परिवर्तनों को बहिष्कृत करेगा। ऐसा इसलिए है क्योंकि यह सिर्फ hg outgoing के बराबर चल रहा है और इन परिवर्तनों को बंडल कर रहा है।

तो कुछ काम arounds:

  • आप जानते हैं कि आप कम से कम एक ड्राफ्ट या अपने गुप्त changesets के एक पूर्वज के रूप में सार्वजनिक निवर्तमान changeset है, तो आप उपयोग कर सकते हैं

    $ hg bundle --base "parents(outgoing())" 
    

    आप जो चाहते हैं उसे प्राप्त करने के लिए। outgoing() पुनरावृत्ति लापता मसौदे और सार्वजनिक परिवर्तनों को चुन देगा और parents(outgoing() उपयुक्त आधार होंगे। चूंकि आप --base का उपयोग करते हैं, इसलिए आप इन अड्डों से सभी वंशज (सार्वजनिक, मसौदा और गुप्त) प्राप्त करते हैं।

  • आप अस्थायी रूप से, अपने गुप्त changesets मसौदा बना सकता है बंडल, और फिर उन्हें गुप्त निशान फिर से:

    $ secret=$(hg log --template "{rev} " -r "secret()"); \ 
        hg phase -d $secret; \ 
        hg bundle out.hg; \ 
        hg phase -f -s $secret 
    

    (मैं Zsh का उपयोग करें और वहाँ मैं ${=secret} बजाय $secret उपयोग करने के लिए क्योंकि Zsh ऐसा नहीं करता था । गलत parame गुजर - डिफ़ॉल्ट रूप से पैरामीटर विस्तार पर शब्द बंटवारे)

    यह श्रृंखला ; बजाय && जब से तुम क्या hg bundle कॉल में क्या होता है की परवाह किए बिना चरणों पुनर्स्थापित करने के लिए चाहता हूँ के साथ आदेशों के लिए महत्वपूर्ण है hg bundle पर टियर का मतलब यह नहीं होना चाहिए कि आप गुप्त परिवर्तनों के बारे में सारी जानकारी खो देते हैं। ध्यान दें कि चूंकि गुप्त परिवर्तनों में केवल गुप्त वंशज हैं, इस तकनीक के साथ कोई जानकारी हानि नहीं है।

    आप एक खोल उर्फ ​​में इस बारी कर सकते हैं:

    [alias] 
    bundle-all = !secret=$(hg log --template "{rev} " -r "secret()"); 
          hg phase -d $secret; 
          hg bundle [email protected]; 
          hg phase -f -s $secret 
    

    [email protected] मर्क्युरियल द्वारा विस्तार किया जाता है से पहले उर्फ ​​शुरू हो जाती है और यह आप hg bundle के लिए आवश्यक तर्क सम्मिलित करने देती है।

ध्यान दें कि चरण की जानकारी बंडलों में संग्रहीत नहीं की जा सकती है - बंडल प्रारूप को समायोजित करने के लिए इसे बदला नहीं गया है।

1

क्या आप जानते हैं कम से कम एक सार्वजनिक changeset है, तो आप इस का उपयोग कर सकते हैं:

hg bundle -r "not public()" --base public() 

OTOH, कि अगर कोई सार्वजनिक changesets हैं काम नहीं करेगा, यह बजाय का उपयोग करें:

hg bundle -r "not public()" --base null 

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

hg log -r public() -l 1 --template "{rev}" 

और इसकी लंबाई, या [0-9] की उपस्थिति का परीक्षण: क्या वहाँ भी सार्वजनिक changesets हैं के लिए

एक परीक्षण के उत्पादन में कब्जा करने के लिए है।

संबंधित मुद्दे