मर्क्यूरियल के साथ, मैं पुश करने से पहले एक श्रृंखला में कई परिवर्तनों को कैसे "संपीड़ित" कर सकता हूं?


96

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

मेरे पास अब 3 बदलाव हैं जिन्हें मैं वास्तव में दूरस्थ रिपॉजिटरी पर धकेलना चाहूंगा, उदाहरण के लिए संदेश "इंप्लीमेंटिंग फीचर एक्स" के साथ एक बदलाव।

बिना ज्यादा परेशानी के मैं ऐसा कैसे कर सकता हूं? मेरा मानना ​​है कि मैं इसे पैच के साथ कर सकता था, लेकिन यह बहुत काम की तरह लगता है।


40
स्पष्ट रूप से यह मेरा स्थान नहीं है कि आप अपने परिवर्तनों को संपीड़ित करने की कोशिश से बाहर बात करें, लेकिन आप इस पर विचार करना चाह सकते हैं कि संस्करण नियंत्रण का आधा मूल्य "क्यों" सिर्फ "नहीं" महीनों और वर्षों बाद जवाब दे रहा है। एक विशेषता के बारे में एक सटीक प्रतिनिधित्व, और किस चरणों में, भविष्य के मूल्य का हो सकता है। इसे त्यागने से ऐसा लगता है ... असम्बद्धता।
Ry4an Brase

इससे एक और सवाल पैदा होता है ... 'हेवेडिट' और 'पतन' में क्या अंतर है
सिल्वानार

1
पतन hvedit की सुविधाओं का एक सबसेट प्रदान करता है, और histedit में बहुत अधिक सहज UX है।
स्टीफन रस्क

1
यह मर्ज किए गए बदलाव संदेश को संपादित करने के लिए एक तंत्र भी प्रदान करता है।
स्टीफन रस्क

1
@ Ry4an: वास्तव में, स्क्वैशिंग / टकराना कुछ मामलों में संस्करण नियंत्रण की प्रासंगिकता को जोड़ता है। स्क्वैशिंग के बिना, मेरे पास हर दिन दो कमिट होंगे, जिनका फीचर्स या बग फिक्स से कोई लेना-देना नहीं है, लेकिन लैपटॉप से ​​डेस्कटॉप पर जाने वाले कोड के लिए हैं और इसके विपरीत। वे सिर्फ संस्करण इतिहास में शोर जोड़ते हैं।
जॉन रेनॉल्ड्स

जवाबों:


39

विस्तार के बारे में कैसे ?


20
भविष्य की ओर से बधाई! मैं बस एक ही कार्यक्षमता के लिए googled और जाहिरा तौर पर आजकल hg इस बॉक्स के बाहर का समर्थन करता है hg rebase --collapseरिबेज कमांड पर hg विकी देखें। चूंकि यह प्रश्न तीसरा समग्र खोज परिणाम है और स्टैकओवरफ्लो पर पहला मैंने सोचा कि जानकारी उपयोगी हो सकती है।
angrganz

1
भविष्य में और भी आगे बढ़ने की बधाई !! रिबास एक्सटेंशन केवल एक शाखा से दूसरी शाखा में परिवर्तन करने वाले टारगेट पर लक्षित होता है। हां, एक --collapse विकल्प है, लेकिन अभी भी केवल शाखाओं में बदलावों के सेट को स्थानांतरित करते समय ही लागू होता है। देखें < mercurial-scm.org/wiki/… >
ब्रैड ऑस्ट्रेइकर

3
आप उपयोग कर सकते हैं hg rebaseके साथ --collapseएक एकल शाखा के भीतर।
UuDdLrLrSs

52

Histedit विस्तार वास्तव में आप के लिए क्या देख रहे है।

hg histedit -o

या

hg histedit --outgoing

निवर्तमान परिवर्तनकों की एक सूची लाएगा। सूची से आप कर सकते हैं

  • एक एकल परिवर्तनक बनाने वाले 2 या अधिक परिवर्तनों को मोड़ो
  • इतिहास से उन्हें हटाते हुए परिवर्तन करें
  • फिर से बदलना आपको पसंद है।

histedit आपको तह किए गए बदलावों के नए प्रतिबद्ध संदेश के लिए संकेत देगा, जो इसे दो संदेशों में "\ n *** \ n" के साथ अलग करते हुए अलग करता है।

आप mq एक्सटेंशन का उपयोग करके समान परिणाम प्राप्त कर सकते हैं, लेकिन यह बहुत अधिक कठिन है।

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


धन्यवाद, वास्तव में मैं क्या जरूरत है। यह अच्छा होगा यदि आप इसे TortoiseHg के भीतर से कर सकते हैं - लेकिन कमांड लाइन पर्याप्त सरल है।
सिलवनार

21

हां, आप इसे पैच के साथ कर सकते हैं: मान लें कि आपका काम 110 के माध्यम से 100 के बदलावों में शामिल है

  1. एक पैच बनाएँ:

    % hg export -o mypatch 100:110 --git

  2. 99 पर अपडेट करें:

    % hg update 99

  3. पैच को -कोई-कमिट के साथ लागू करें (अन्यथा आपको अपने सभी परिवर्तन वापस मिल जाएंगे):

    % hg import --no-commit mypatch

  4. सभी परिवर्तन एक साथ करें:

    % hg commit

  5. अब आपके पास दो सिर (110 और 111) हैं, जो आपकी कार्यशील निर्देशिका में उत्पन्न होने वाली फ़ाइलों के संदर्भ में समतुल्य होने चाहिए - शायद पुराने को अलग करने से पहले उन्हें पवित्रता के लिए अलग करें:

    % hg strip 100

ठीक है, अब जब मैंने इसे समाप्त कर दिया है, तो यह लंबा लग रहा है, लेकिन यह अपने आप को बार-बार किया है, मुझे यह बहुत ज्यादा नहीं लगता है कि यह बहुत अधिक है ...


1
शानदार उत्तर, लेकिन एक शर्त है: MQ एक्सटेंशन सक्षम होना चाहिए
क्रिस केली

बाइनरी फ़ाइलों में बदलाव को भी शामिल करने के लिए, --गत विकल्प का उपयोग करना सुनिश्चित करें: उदाहरण के लिए: "hg Export -o mypatch 100: 110 --git" अधिक जानकारी के लिए, कृपया देखें: stackoverflow.com/a/12537738/ 367663 मैंने उत्तर में संशोधन करने के लिए स्वतंत्रता ली है।
खारलोस डोमिंगुएज

1
लगता है अधूरा, क्यों नहीं hg strip --keepऔर फिर एक प्रतिबद्ध में सब कुछ करता है?
जी डेमेकी

@ G.Demecki क्योंकि यह संभावित रूप से बहुत नुकसानदेह ऑपरेशन है ..? हालांकि एमक्यू ओवरफिल है (और यहां तक ​​कि अनुशंसित नहीं है), जब इस तरह के वर्कफ़्लो को छोड़कर।
user2864740

@ user2864740 आप सही हो सकते हैं, क्योंकि मैं मर्क्यूरियल विशेषज्ञ नहीं हूं। लेकिन डिफ़ॉल्ट रूप से, डायरेक्टरी hg stripमें बैकअप देगा .hg/strip-backup/। मुझे लगता है कि यह उतना सुरक्षित नहीं है, git reflogलेकिन फिर भी किसी प्रकार का बचाव करता है।
जी डेमेकी

19

यदि आप TortoiseHg का उपयोग कर रहे हैं, तो उपयोग केवल दो संशोधनों का चयन कर सकता है (गैर-बाद वाले लोगों का चयन करने के लिए CTRL का उपयोग करें), राइट क्लिक करें और "कम्प्रेशन हिस्ट्री" चुनें

उसके बाद आप पहले चुने गए पहले बदलाव से शुरू होने वाले नए सिर में एक नई परिवर्तन सूची प्राप्त करेंगे, इसमें आपके द्वारा चुने गए लोगों के बीच सभी अवरोही परिवर्तन सूचियाँ होंगी।

आप पुरानी परिवर्तन सूचियों को आसानी से निकाल सकते हैं यदि आपको उनकी आवश्यकता नहीं है: इसके लिए एमक्यू एक्सटेंशन का उपयोग करें । फिर से, TortoiseHg में: पहली परिवर्तन सूची पर राइट क्लिक करें जिसे सभी के वंशजों के साथ छीनने की आवश्यकता है, "इतिहास संशोधित करें -> पट्टी"


18

इस तह के लिए mq का उपयोग करने का मेरा पसंदीदा तरीका यहाँ वर्णित के रूप में TortoiseHg का उपयोग कर रहा है । हालाँकि, इसे कमांड लाइन से आसानी से किया जा सकता है जैसे:

hg qimport -r <first>:<last> 
    -- where <first> and <last> are the first and last changesets 
    -- in the range of revisions you want to collapse

hg qpop <first>.diff
    -- remove all except for the first patch from the queue
    -- note: mq names patches <#>.diff when it imports them, so we're using that here

hg qfold <next>.diff
    -- where <next> is <first>+1, then <first>+2, until you've reached <last>

hg qfinish -a
    -- apply the folded changeset back into the repository

(क़फ़न क़दम करने का एक बेहतर तरीका हो सकता है, लेकिन मुझे इसकी जानकारी नहीं है, क्योंकि मैं आमतौर पर उस ऑपरेशन के लिए टोर्टोइज़हग का उपयोग करता हूं।)

यह पहली बार में थोड़ा जटिल लगता है, लेकिन एक बार जब आपने mq का उपयोग करना शुरू कर दिया है, तो यह बहुत सीधा और स्वाभाविक है - इसके अलावा आप mq के साथ अन्य सभी प्रकार के काम कर सकते हैं जो कि बहुत आसान हो सकते हैं!


4

hg collapseऔर hg histeditसबसे अच्छे तरीके हैं। या, बल्कि, सबसे अच्छे तरीके होंगे, अगर वे मज़बूती से काम करते हैं ... मैं histeditतीन मिनट के भीतर स्टैक डंप के साथ दुर्घटनाग्रस्त हो गया । Collapseयह उतना बेहतर नहीं है।

सोचा था कि मैं दो अन्य बीकेएम साझा कर सकता हूं:

  1. hg rebase --collapse

    यह विस्तार मर्क्यूरियल के साथ वितरित किया जाता है। मुझे अभी तक इससे कोई समस्या नहीं है। hg rebaseसीमाओं के आसपास काम करने के लिए आपको कुछ खेल खेलने पड़ सकते हैं - मूल रूप से, यह एक ही शाखा पर पूर्वज के नाम या डिफ़ॉल्ट पर रिबासिंग करना पसंद नहीं करता है, हालांकि यह अनुमति देता है यदि बीच में (नाम वाली) शाखाओं के बीच पुनरावृत्ति होती है।

  2. रिपॉजिटरी ( foo/.hg) को वर्किंग डायरेक्टरी ( bar) और उसकी फाइलों में ले जाएं। कोई और रास्ता नही।

कुछ लोगों ने दो क्लोन पेड़ बनाने और उनके बीच फ़ाइलों की प्रतिलिपि बनाने के बारे में बात की है। या उन दोनों के बीच पैचिंग। इसके बजाय, .hgनिर्देशिकाओं को स्थानांतरित करना आसान है ।

hg clone project work
... lots of edits
... hg pull, merge, resolve
hg clone project, clean
mv work/.hg .hg.work
mv clean/.hg work/.hg
cd work
... if necessary, pull, nerge, reconcile - but that would only happen because of a race
hg push

यह तब तक काम करता है जब तक कि सच्चे रिपोजिटरी, .hgपेड़, कार्यशील निर्देशिका और उसकी फाइलों से स्वतंत्र न हों।

यदि वे स्वतंत्र नहीं हैं ...


2015 में, histeditइस कार्य के लिए एक बहुत अच्छा विकल्प है। मुझे अभी भी इस पर भरोसा नहीं है क्योंकि मैं एक git rebase -i करता हूं, लेकिन यह क्रैश नहीं होता है .. कम से कम नए संस्करण आपको एक अस्थायी शाखा पर छोड़ देंगे अगर कुछ बुरी तरह से गलत हो जाता है, तो केवल उसी समय जब परिवर्तन किया जाएगा। नई शाखा के प्रतिबद्ध होने के बाद है।
user2864740

2

मैंने कभी मर्क्यूरियल का उपयोग नहीं किया है, लेकिन यह बहुत कुछ ऐसा लगता है जैसे मार्टिन फाउलर अपने ब्लॉग पर बहुत पहले से नहीं बात कर रहे थे:

http://martinfowler.com/bliki/MercurialSquashCommit.html


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

0

सिर्फ hg strip --keepआज्ञा क्यों नहीं ?

तब आप सभी परिवर्तनों को एक प्रतिबद्धता के रूप में कर सकते हैं।


@ स्ट्राबेरी एक जवाब नहीं देता है ?? यह लगता है कि यह पूरी तरह से लेखक के सवाल का जवाब देता है। क्या आप अपनी बात विस्तार से बता सकते हैं?
जी डेमेकी

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

1
@ स्ट्राबेरी वास्तव में यह प्राचीन धागा है। लेकिन स्वीकृत उत्तर पुराना है, क्योंकि मर्क्यूरियल को अब इस नौकरी के लिए अलग से 3 पार्टी विस्तार की आवश्यकता नहीं है।
जी। डेमेकी

0

हिस्टडिट वही करेगा जो आप चाहते हैं, लेकिन यह संभवतः ओवरकिल है। यदि आपको केवल एक चीज की आवश्यकता है, तो कुछ बदलावों को एक साथ मोड़ना है, संक्षिप्त करें एक्सटेंशन कार्य करेगा।


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

और केवल यूआई को समझने की समस्या वास्तव में समझ में नहीं आती है .. वैसे भी, पिछले कुछ समय के लिए, जब हेवडिट 'मेसैजेस, साथ ही साथ मैसेजिंग को बदलने की अनुमति देता है। हेवडिट एकदम सही है; यदि कुछ भी हो, तो पतन का विस्तार कम होता है।
user2864740

0

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

... --> THIS --> ... --> THAT --> ... --> LAST

जांचें कि आपके कमेंट्स प्रकाशित नहीं हैं ::

$ hg glog -r "draft() & ($THIS | $THAT)"

अद्यतन करने के LASTलिए ::

$ hg up

और आयात THISएमक्यू में शामिल है ::

$ hg qimport $THIS::.

सभी पैच-अप लागू करें और केवल पहले लागू करें THIS::

$ hg qpop -a
$ hg qpush
$ hg qapplied
... THIS ...

साथ जुड़ें THAT::

$ hg qfold $THATNAME

नोट नाम का THATNAMEउपयोग खोजने के लिए ::

$ hg qseries

सभी पैच लागू करें और उन्हें रिपॉजिटरी इतिहास में ले जाएँ ::

$ hg qpush -a
$ hg qfinish -a

विषय पर मेरा ब्लॉग पोस्ट मर्क्यूरियल में दो कमिट्स को मिला रहा है


0

हां, strip --keepलेखक के प्रश्न के लिए काम करता है। लेकिन यह दूसरों से थोड़ा अलग था, उदाहरण के लिए, यदि आपके पास 1 से 30 तक का संस्करण है, लेकिन केवल संस्करण 12-15 को संक्षिप्त करना चाहते हैं। अन्य समाधान काम करते हैं लेकिन नहीं strip --keep

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