2009-07-06 10 views
18

Mercurial: Merging one file between branches in one repo से संबंधित, मैं एक फ़ाइल पर बैकआउट ऑपरेशन करने की कोशिश कर रहा हूं, भले ही वह फ़ाइल वापस आने वाले संशोधन में कई प्रतिभागियों में से एक थी।Mercurial में, मैं एक विशेष फ़ाइल में एक रिवर्स-पैच कैसे लागू करूं?

एचजी परिवर्तनशील उन्मुख उपकरण है, यह फाइलों पर काम नहीं करना चाहता है।

निकटतम मुझे लगता है कि एक diff बनाने के लिए एचजी निर्यात का उपयोग करना था, diff संपादित करना था, और उसके बाद फ़ाइल को रिवर्स ऑर्डर में पैच करने के लिए आयात करना था।

.. लेकिन फिर मैंने इस कष्टप्रद स्थिति को मारा जहां http://hgbook.red-bean.com/read/finding-and-fixing-mistakes.html का दावा है कि hg patch पर कोई विपरीत विकल्प नहीं है।

तो सबसे नज़दीकी चीज जो मैं सोच सकता हूं, ऊपर के रूप में एक हाथ से संपादित पैच उत्पन्न करना है, और उसके बाद एक रिवर्स पैच लागू करने के लिए वेनिला पैच -आर का उपयोग करना है।

hg backout कमांड यहां उपयोगी प्रतीत होता है, लेकिन वास्तव में एक लाल हेरिंग है।

वहाँ एक बेहतर तरीका होने के लिए मिला है, नहीं?

+2

- रिवर्स विकल्प * पैच * है, नहीं * एचजी पैच *। – balpha

उत्तर

22

आप का उपयोग कर यह कर सकते हैं बस -I एक पंक्ति के साथ backout के लिए तर्क (दिए गए पैटर्न से मेल खाते नामों में शामिल हैं):

hg backout --merge -I thefiletorevert -m 'message' OFFENDINGREVISIONID 

उदाहरण स्क्रिप्ट:

hg init testrepo 
cd testrepo 
echo -e "line1\n\nline3" > file1 
echo -e "line1\n\nline3" > file2 
hg commit -A -m 'changes to two files' 
perl -pi -e 's/line1/line 1/' file1 
perl -pi -e 's/line1/line 1/' file2 
hg commit -m 'put spaces in line1' 
perl -pi -e 's/line3/line 3/' file1 
perl -pi -e 's/line3/line 3/' file2 
hg commit -m 'put spaces in line3' 
hg backout --merge -I file1 -m 'remove spaces from line1' 1 

नमूना उत्पादन :

adding file1 
adding file2 
reverting file1 
created new head 
changeset 3:6d354f1ad4c5 backs out changeset 1:906bbeaca6a3 
merging with changeset 3:6d354f1ad4c5 
merging file1 
0 files updated, 1 files merged, 0 files removed, 0 files unresolved 
(branch merge, don't forget to commit) 

परिणामी फ़ाइल सामग्री:

file1:line1 
file1:line 3 
file2:line 1 
file2:line 3 

सूचना है कि file1 यह याद आ रही है बीच changeset की backout के बाद लाइन में जगह है, और वर्बोज़ लॉग केवल एक फ़ाइल backout में बदल पता चलता है:

$ hg log -v -r tip 
changeset: 3:6d354f1ad4c5 
tag:   tip 
parent:  1:906bbeaca6a3 
user:  Ry4an Brase <[email protected]> 
date:  Mon Sep 14 12:17:23 2009 -0500 
files:  file1 
description: 
remove spaces from line1 
+0

मुझे लगता है कि मैं इस समाधान को समझता हूं, लेकिन यह मामला मेरा से आसान लगता है, क्योंकि यहां आप टिप बदलते हुए (फाइलों में से एक) का समर्थन कर रहे हैं, जबकि बाल्फा ऐतिहासिक परिवर्तन का समर्थन करने के मेरे सामान्य मामले से संबंधित है। – djsadinoff

+1

नहीं, यह एक गैर-टिप परिवर्तन के लिए ठीक काम करेगा, हालांकि आपको अंत में 'hg विलय' करने की आवश्यकता होगी। हालांकि, आप अभी भी एक इतिहास ग्राफ के साथ समाप्त हो जाएंगे जो बाल्फा की कॉपी-इट-ओवर के विपरीत, क्या हुआ और परिवर्तन माता-पिता को सटीक रूप से प्रतिबिंबित करता है, जो एक रैखिक चेंजलॉग उत्पन्न करेगा। –

+0

कूल। यदि आप दफन किए गए परिवर्तन का समर्थन करने के साथ एक उदाहरण पोस्ट करना चाहते थे, तो मैं इसे सही चिह्नित करूंगा। – djsadinoff

6

यहां मैं क्या करूँगा: टिप संशोधन का एक नया क्लोन का उपयोग करें।

hg backout --merge -r revision_where_the_change_happened 

काम कर कॉपी में उलट परिवर्तन मर्ज करने के लिए।

अब आप अपने नियमित काम की नकल करने के लिए सवाल में फ़ाइल की प्रतिलिपि और

hg commit -m "Reversed the changes to file.h made in revision bla" 

प्रतिबद्ध और क्लोन जो आपने ऊपर बनाया फेंक देते हैं।

इस तरह, mercurial पता नहीं है कि revision_where_the_change_happened और यह प्रतिबद्धता के बीच एक कनेक्शन है। आप इस याद करने के लिए तेज चाहते हैं, बजाय backout विलय के बाद एक

hg revert {all files except the one in question} 

कर काम कर कॉपी में और करने से पहले करते हैं। दूसरी तरफ, आपको क्लोन पर काम करने की ज़रूरत नहीं है, क्योंकि आप बैकआउट प्रतिबद्ध रखना चाहते हैं।

मुझे लगता है कि आप जिस तरीके से उपयोग करते हैं, उस पर निर्भर करता है कि विशेष फ़ाइल परिवर्तन में बदलाव का एक हिस्सा कितना बड़ा था।

3

रिवर्ट कमांड का उपयोग करें।

hg revert -r1 file 

इस संशोधन 1. में संस्करण के लिए फ़ाइल की सामग्री को वापस लौटने चाहिए फिर आप आगे इसे संपादित और सामान्य रूप प्रतिबद्ध कर सकते हैं।

+0

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

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