2009-05-12 13 views
55

कहें, मैंने अपने कोड में कई बदलाव किए हैं और केवल उन परिवर्तनों में से कुछ को करने की आवश्यकता है। क्या यह Mercurial में करने का कोई तरीका है? मुझे पता है कि darcs इस तरह की एक सुविधा है।Mercurial चेरी प्रतिबद्ध करने के लिए परिवर्तन

मुझे पता है hg transplant शाखाओं के बीच ऐसा कर सकता है, लेकिन मुझे वर्तमान शाखा में कोड करने के लिए ऐसा कुछ चाहिए और कुछ अन्य शाखाओं से परिवर्तन सेट जोड़ने पर मुझे इसकी आवश्यकता नहीं है।

+2

मैंने हाल ही में एक डुप्लिकेट के रूप में पूछा। मुझे शब्दावली के बारे में पता नहीं था इसलिए मुझे खोज करते समय यह नहीं मिला। मेरे प्रश्न पर स्वीकृत उत्तर देखें जिसमें एचजी भ्रष्टाचार शामिल है, Mercurial 2.0 में नया। http://stackoverflow.com/questions/10288482/workflow-to-backport-change-into- अलग-mercucial-branch – oob

उत्तर

33

चाड के रूप में एमक्यू का उल्लेख एक तरीका है। और हल्के समाधान भी हैं:

  • Record extension जो लगभग उसी तरह से काम करता है जैसे डार्क्स रिकॉर्ड। यह Mercurial के साथ वितरित किया जाता है।
  • जो आप कुछ खास परिवर्तन "को स्थगित करने के लिए", आप अपने परिवर्तन (जो कि हटाया नहीं कर रहे हैं)
+0

इस उत्तर में अतिरिक्त जानकारी देखें: http://stackoverflow.com/a/7768682/411282 –

3

मेरा मानना ​​है कि Mercurial Queues Mercurial के लिए इस भूमिका को भरता है। वहाँ a pretty good tutorial वहाँ जुड़ा हुआ है।

+0

ऐसा लगता है कि मैं क्या चाहता हूं, हालांकि यह प्रक्रिया बहुत अच्छी होगी अगर प्रक्रिया अधिक इंटरैक्टिव थी एचजी ट्रांसप्लेंट कमांड। – mansu

16

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

चलें कहते हैं कि तुम इतिहास की इस तरह है:

---O---O---A---B---C 

पहला उदाहरण स्क्वैश है करता है ए, बी, और सी प्रथम init MQ:

$ hg qinit 

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

$ hg qimport -r -3:-1 

3 पैच से पैच के रूप में आयात इसका मतलब है कि पिछले करने के लिए प्रतिबद्ध हैं। आप hg qseries के साथ इन पैच की स्थिति की जांच कर सकते हैं। यह कुछ इस तरह दिखाई देना चाहिए:

$ hg qseries 
101.diff 
102.diff 
103.diff 

कहाँ संख्या 101, 102 और 103 वचन देता करता, बी और सी के स्थानीय संशोधन संख्या के अनुरूप अब इन पैच लागू किया, जो परिवर्तन का मतलब हैं कि वे पहले से ही काम कर रहे प्रतिलिपि में हैं। hg qpop का उपयोग करके आप कामकाजी प्रतिलिपि में बदलाव से छुटकारा पा सकते हैं और उन्हें पैच फॉर्म में सहेज सकते हैं। आप या तो hg qpop; hg qpop को स्टैक से सी और बी को पॉप करने के लिए कह सकते हैं, या "पॉप टू" पर पैच निर्दिष्ट कर सकते हैं। इस मामले में, यह कुछ इस तरह होगा:

$ hg qpop 101.diff 
now at: 101.diff 

अब आप पैच पैच कतार में बी और सी करता है के लिए है, लेकिन वे लागू नहीं होती हैं (उनके परिवर्तन कर दिया गया "खो" है - वे केवल मौजूद पैच कतार क्षेत्र में)। अब आप इन पैच को आखिरी में जोड़ सकते हैं, यानी हम एक नई प्रतिबद्धता बनाते हैं जो ए + बी + सी के बदलावों के बराबर है।

$ hg qfold -e 102.diff 103.diff 

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

---O---O---A+B+C 

एक अन्य प्रयोग मामला है हम पहले के रूप में इतिहास का एक ही प्रकार का हो, तो , लेकिन हम पैच बी ड्रॉप करना चाहते हैं और ए + सी मर्ज करना चाहते हैं। यह वास्तव में उपरोक्त के समान ही है। जब आप qfold कदम पर आते हैं, तो आप बस पिछले पिछले 2 प्रतिबद्ध बजाय प्रतिबद्ध में गुना होगा:

$ hg qfold -e 103.diff 

इस पैच कतार में बी के लिए परिवर्तन छोड़ देता है, लेकिन यह काम कर प्रतिलिपि के लिए लागू नहीं है और इसकी प्रतिबद्धता इतिहास में नहीं है। आप चलाकर इस देख सकते हैं:

$ hg qunapplied 
102.diff 

इतिहास अब यह है, जहां एक + सी एक भी प्रतिबद्ध है कि जोड़ती परिवर्तन ए और सी है की तरह लग रहा:

---O---O---A+C 

एक अंतिम उपयोग के मामले हो सकता है कि आप केवल लागू सी आप के रूप में ऊपर qimport चलाकर ऐसा करने चाहते हैं प्रतिबद्ध करने के लिए की जरूरत है, और आप सभी पैच आप नहीं करना चाहता था बंद पॉप जाएगा:

$ hg qpop -a 

-एक झंडा साधन बंद पॉप सभी पैच।

$ hg qpush 103.diff 

यह इस इतिहास के साथ आप छोड़ देता है:

---O---O---C 

बार जब आप इस सब के साथ किया जाता है, आप कतार नगण्य को ख़त्म करने की जरूरत है अब आप सिर्फ एक आप चाहते हैं आवेदन कर सकते हैं। इसके साथ किया जा सकता है:

$ hg qfinish -a 

तो हम वहां हैं। अब आप hg push चला सकते हैं और केवल वही कार्य कर सकते हैं जो आप चाहते हैं, या hg email मेलिंग सूची में एक सुसंगत पैच चला सकते हैं।

+0

बहुत अच्छी पोस्ट, धन्यवाद! – jv42

2

qct (Qt Commit Tool) आज़माएं। इसमें "चयन परिवर्तन" सुविधा है जो व्यक्तिगत परिवर्तनों को पूर्ववत करने के लिए आपके लिए 3-तरफा विलय टूल शुरू करती है। आपके प्रतिबद्ध होने के बाद, वे आपको "undid" बदलते हैं।

+0

मुझे यह नहीं पता था। धन्यवाद। – mansu

36

आप Windows के लिए TortoiseHg 1.x का उपयोग कर रहे हैं, तो this feature is implemented beautifully शानदार तरीके से (कोई एक्सटेंशन) की आवश्यकता।

  1. TortoiseHg Commit Tool चलाएं।
  2. एक फ़ाइल चुनें जिसके लिए आप केवल अपने परिवर्तनों का सबसेट करना चाहते हैं।
  3. पूर्वावलोकन फलक में हंक चयन टैब पर क्लिक करें।
  4. टॉगल करने के लिए स्पेसबार को डबल-क्लिक करें या उपयोग करें जो परिवर्तन को शिकारी में होना चाहिए।

TortoiseHg 2.x के लिए, हंक चयन टैब अब चला गया है। इसकी जगह, Shelve tool है। पुराने हंक चयन की तुलना में इसमें कुछ और विशेषताएं हैं। उन नई विशेषताएं कुछ अतिरिक्त जटिलता की कीमत पर आती हैं।

enter image description here

नोट जब इस सुविधा का उपयोग स्पष्ट मर्क्युरियल टांड़ एक्सटेंशन सक्षम करने की कोई जरूरत नहीं है। response to a different TortoiseHg question: में स्टीव बोरो (लीड टोर्टोइज एचजी डेवलपर) के मुताबिक, "हमारे पास शेल्व एक्सटेंशन की एक स्थानीय प्रति है और इसे सीधे कॉल करें।"


लिए TortoiseHg 2.7+, इस कार्यक्षमता सुधार किया गया है और फिर से शुरू की। अब यह सीधे कमिट उपकरण में बनाया गया है:

example of change selection in the commit tool

छोड़ दिया कि शीर्ष फ़ाइल पर फ़ाइल सूची में सूचना चेक किया गया है इंगित करने के लिए यह शामिल किया जाएगा, दूसरी फ़ाइल चुना नहीं गया है, क्योंकि यह नहीं होगा शामिल, और तीसरी फ़ाइल, Sample.txt, भर जाती है (नल चेकबॉक्स सूचक) क्योंकि केवल उस फ़ाइल से किए गए परिवर्तनों का चयन प्रतिबद्धता में शामिल किया जाएगा।

नमूना.txt में परिवर्तन जो शामिल किया जाएगा, छवि के निचले-दाएं परिवर्तन चयन भाग में चेक किया गया है। जो परिवर्तन बाहर रखा जाएगा वह अनचेक किया गया है और diff व्यू ग्रे हो गया है। यह भी ध्यान दें कि शेल्व टूल के लिए आइकन अभी भी आसानी से उपलब्ध है।

+1

आह, इसलिए मुझे नहीं मिला कि यह एक सवाल क्यों था। यदि आप TortoiseHg का उपयोग नहीं कर रहे हैं तो यह आसानी से नहीं किया जाता है। मुझे यह नहीं पता था। –

+0

हम में से उन लोगों के बारे में क्या है जो संस्करण 2 का उपयोग कर रहे हैं? http://tortoisehg.bitbucket.org/manual/2.0/commit.html में एक हंक चयन टैब नहीं है जिसे मैं देख सकता हूं। – alsuren

+0

@alsuren: TortoiseHg संस्करण 2.x – mwolfe02

2

मैं commit-patch का उपयोग करता हूं। यह एक स्क्रिप्ट है जो आपको काम करने से पहले diff संपादित करने देती है। यह Emacs के diff-mode और vc-mode के साथ वास्तव में अच्छा है।

अतीत में मैंने crecord का उपयोग किया था, लेकिन इसमें यूनिकोड से संबंधित कीड़े हैं (वास्तव में रिकॉर्ड एक्सटेंशन में बग है, जो crecord निर्भर करता है)।

15

मुझे लगता है कि मुझे कुछ याद आ रहा है क्योंकि किसी ने इसे पहले ही सुझाव नहीं दिया है।

सामान्य "एचजी प्रतिबद्ध" कमांड का चयन चुनने के लिए किया जा सकता है कि आपको क्या करना है (आपको स्थानीय कार्य निर्देशिका में सभी लंबित परिवर्तन करने की ज़रूरत नहीं है)।

तुम इतनी तरह परिवर्तन का एक सेट है, तो:

M ext-web/docroot/WEB-INF/liferay-display.xml 
M ext-web/docroot/WEB-INF/liferay-portlet-ext.xml 
M ext-web/docroot/WEB-INF/portlet-ext.xml 

आप के साथ उन परिवर्तनों के सिर्फ दो प्रतिबद्ध कर सकते हैं ...

hg commit -m "partial commit of working dir changes" ext-web/docroot/WEB-INF/liferay-display.xml ext-web/docroot/WEB-INF/liferay-portlet-ext.xml 

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

+6

अन्य उत्तर में से कई केवल एक फ़ाइल के भीतर से परिवर्तन का चयन करें (हालांकि यह स्पष्ट नहीं है कि अगर यह सवाल भी नहीं करना है, तो एक वोट दें है) –

7

आप record extension का उपयोग कर सकते हैं, जिसे Mercurial के साथ वितरित किया जाता है।

आप इसे पहले अपने ~/.hgrc फ़ाइल में सक्षम करने के लिए [extensions] अनुभाग में जोड़कर जरूरत है: तो फिर,

[extensions] 
record= 

बस इसके बजाय प्रकार hg recordhg commit की है, और आप जो जो करने के लिए बदल जाता है का चयन करने के लिए सक्षम हो जाएगा फाइलें जिन्हें आप प्रतिबद्ध करना चाहते हैं।

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

+1

crecord कि में रिकॉर्ड से अधिक एक फायदा है आप * भागों का चयन कर सकते के साथ की * सौदा एक हंक और इंटरफ़ेस बहुत अच्छे भी है: डी –

+1

रिकार्ड विस्तार पेज का कहना है * इस एक्सटेंशन हटाई गई है, सुविधा अब मर्क्युरियल कोर के हिस्से के रूप एचजी --interactive प्रतिबद्ध है *। [यह उत्तर] देखें (http://stackoverflow.com/a/7768682/2072035)। – saaj

-1

सबसे पहले आपको जीयूआई के बारे में जो कुछ भी पता था उसे भूल जाना चाहिए और कमांडलाइन पर वापस जाना चाहिए। filelist.txt अपने filelist

अगला संपादित नामक एक पाठ फ़ाइल में अपने सभी संशोधित फ़ाइलों

एचजी स्टेट> filelist.txt

यह पाइप उन फ़ाइलों को शामिल करने के लिए: अगली कमांडलाइन से ऐसा आप प्रतिबद्ध करना चाहते हैं।

अंत में फ़ाइलसेट sytnax का उपयोग कर के लिए प्रतिबद्ध:

एचजी प्रतिबद्ध "सेट: 'listfile: test.txt'"

3

कुछ समय बीत चुका है। अब सबसे अच्छा विकल्प लगता है hg commit --interactive

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