मैं हटाए गए फ़ाइल को मर्क्यूरियल में कैसे पुनर्प्राप्त कर सकता हूं (यदि बिल्कुल भी)?


100

गलती से, सीएलआई के विपरीत एक जीयूआई का उपयोग करके, मैंने एक मर्क्यूरियल प्रोजेक्ट में प्रत्येक फ़ाइल को हटा दिया।

मैंने रिवर्ट ओके के साथ पुनर्प्राप्त किया और कुछ काम खो दिया, जो कि मेरे पास टाइम मशीन है क्योंकि मैं आसानी से वापस मिल सकता था। लेकिन क्या ऐसी फ़ाइलों को अन-हटाने / हटाने का एक तरीका है? मैनुअल के माध्यम से फँसाया और गुगली की लेकिन कुछ भी नहीं देख सकता। कोई प्लगइन्स?

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

पीएस मुझे पता है कि निर्देशिका से हटाने के बिना hg forgetया hg remove -Afहटा देगा, लेकिन मेरा सवाल उस त्रुटि के साथ करना है जो मैंने कार्रवाई के माध्यम से शांत सोच के विपरीत किया था।


1
आपको एक पुराने संशोधन की जांच करने में सक्षम होना चाहिए और ठीक होना चाहिए (निश्चित रूप से यह केवल उसी स्थिति में काम करता है जब आप इतिहास को फिर से नहीं लिखते हैं)
9

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

1
संबंधित प्रश्न जो आपको सिर्फ फ़ाइल नाम (तेज़) खोजने की सुविधा देता है: stackoverflow.com/questions/1013550/…
माइकल प्रायर

जवाबों:


152

सबसे पहले, hg grepउस पुनर्प्राप्त फ़ाइल को खोजने के लिए उपयोग करें जिसे आप पुनर्प्राप्त करना चाहते हैं। इस आदेश का आउटपुट आपको अंतिम संशोधन दिखाएगा जिसके लिए फ़ाइल मौजूद थी, और हटाए गए फ़ाइल का पथ। दूसरा, hg revert -r <revision number> <path to deleted file> हटाए गए फ़ाइल अब आपके काम की प्रति में होंगे, जो वापस सिर में करने के लिए तैयार है।


5
मेरे लिए अच्छी तरह से काम किया, धन्यवाद। "मैं कैसे मैं जानबूझकर नष्ट कर दिया एक फ़ाइल को बहाल करते हैं?"
एन.सी.

ग्रहण से यह फ़ाइल टीम पर राइट क्लिक करके किया जा सकता है -> रिवर्ट
एमिल

3
फ़ाइल युक्त संशोधन को खोजने का दूसरा तरीका हैhg log -I '**file.ext'
mpen

2
बस एक FYI करें: आप उस फ़ाइल के पास अभी भी नहीं किए गए कमिट का संशोधन-नंबर चाहते हैं !
लुकास नुथ

8

टिप्पणी से उद्धरण:

मैंने एक रिपॉजिटरी स्थापित की, सभी को कमिट किया, निकाला और फिर दोबारा प्रतिबद्ध किया

यदि यह स्थिति है, तो आपको कार्यशील निर्देशिका को पिछले संशोधन में अद्यतन करने की आवश्यकता है:

$ hg update -C -r-2

नकारात्मक संशोधन संख्या पर ध्यान दें। यदि आपके द्वारा हटाई गई फ़ाइलें पिछले संशोधन में नहीं हैं, तो आप उनका उपयोग करके पा सकते हैं:

$ hg log -v


4

मर्क्यूरियल 1.6 और उससे अधिक के लिए

यदि आप डिलीट फाइल का नाम जानते हैं, तो आप इसका संशोधन आसानी से पा सकते हैं:

hg log -r "removes('NAME.c')"

यह आपको NAME.c (रूट में) नामक एक फ़ाइल को हटाने के लिए संशोधन देगा।

फिर आप फ़ाइल को पिछले संशोधन के साथ (अन्य उत्तरों की तरह) वापस कर सकते हैं:

hg revert -r <revision number> <path to deleted file>

आप जो जानते हैं उसके अनुकूल होने के बजाय आप फ़ाइल नाम पैटर्न का उपयोग कर सकते हैं, उदाहरण के लिए आप **/NAME.cसभी निर्देशिकाओं में खोज करने के लिए उपयोग कर सकते हैं । आप इसके बारे में File Name Patters में पढ़ सकते हैं । और इस लिंक का उपयोग करके नए रिवाइज स्पेसिफिकेशन्स के बारे में जानें


1

स्वीकृत उत्तर के अतिरिक्त - यदि आप किसी कमिटमेंट में सभी निष्कासन को पूर्ववत करना चाहते हैं तो यह तेज है। मैंने इसमें कुछ सौ फाइलों के साथ एक बड़े फ़ोल्डर को हटा दिया और किया hg addremove, जो मेरे इरादे में नहीं था, इसलिए उन सभी को हटाना पड़ा।

मर्क्यूरियल रिपॉजिटरी हिस्ट्री में डिलीट फाइल्स का इस्तेमाल करके जल्दी? + xargs + tr, संशोधन -4 से संस्करण में सभी संशोधन -3 निष्कासन वापस करें:

hg log -r -3 --template "{rev}: {file_dels}\n" | tr ' ' '\n' | xargs hg revert -r -4 

ध्यान दें कि यह विफल हो जाएगा यदि आपकी किसी भी फ़ाइल में नाम का स्थान है; http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html किसी भी टेम्प्लेट के लिए प्रकट नहीं होता है, जहां इस समय {file_dels}विभाजन हो \n


0

आप एक रेपो पर अंतिम प्रतिबद्ध को पूर्ववत कर सकते हैं hg rollback। रोलबैक का केवल एक स्तर उपलब्ध है, इसलिए यदि आपने एक से अधिक प्रतिबद्धों के साथ हटा दिया है, तो यह आपके परिवर्तन को पूरी तरह से पूर्ववत नहीं करेगा। यह केवल आपके स्थानीय रिपॉजिटरी पर काम करता है, इसलिए यदि आपने धक्का दिया है तो आप इसे दूरस्थ रेपो में पूर्ववत नहीं कर पाएंगे।


1
नहीं, यह काम नहीं करता है। मैं मर्क्यूरियल डिस्ट्रिब्यूटेड SCM (संस्करण 1.4.1 + 20091201) के साथ एक मैक का उपयोग कर रहा हूं। मैंने एक रिपॉजिटरी स्थापित की, सभी को हटा दिया, फिर हटा दिया और फिर से प्रतिबद्ध किया लेकिन यह केवल आर (उत्सर्जित) के रूप में चिह्नित फ़ाइलों की एक सूची वापस लाता है, लेकिन वास्तव में फ़ाइलों को वापस नहीं लाता है। यदि मैं फ़ाइलों को आर (उत्सर्जित) और रोलबैक के रूप में चिह्नित करता हूं, तो कुछ भी नहीं होने से पहले।
बैंगनीपिलॉट

आपके द्वारा hg रोलबैक करने के बाद, आपका रेपो वापस आ जाएगा, लेकिन आपकी वर्तमान कार्यशील निर्देशिका में अभी भी आपके परिवर्तन होंगे। बस hg को रोल बैक रिविजन में एक साफ अपडेट करने के लिए कहें, अब टिप पर: hg up -C।
ataylor

1
hg rollbackहटाए गए फ़ाइल को पुनर्प्राप्त नहीं किया जाएगा क्योंकि फ़ाइल को हटाना कमिट लेनदेन का हिस्सा नहीं है।
mrucci

4
ये सही है। यदि आप ऐसे संपादन प्राप्त करना चाहते हैं जो हटाने से पहले प्रतिबद्ध नहीं थे, तो वे खो गए हैं।
ataylor

0

आप hg stripकमांड का उपयोग करके प्रतिबद्ध संशोधनों को हटा सकते हैं , जो कि mq (Mercurial Queues) एक्सटेंशन द्वारा प्रदान किया जाता है। इससे आपको अपनी फाइलें वापस मिलनी चाहिए।

इसे आज़माने से पहले एक बैकअप बना लें, क्योंकि यह मर्क्यूरियल के परिवर्तनशील डेटाबेस को बदल देगा।


0

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

hg clone mydirectory mydirectory1

और अब आप mc (या Far Manager) शुरू करते हैं और तुलना करते हैं कि यह क्या था।

जब यह हो जाए, तो बस हटा दें mydirectory1


0

निम्नलिखित ने मेरे लिए काम किया।

hg revert -r <Revision Number> <File Name>

(वैकल्पिक, सभी फ़ाइलों को वापस करने के लिए)

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