2010-04-21 17 views
51

क्या डेटाबेस से पुराने परिवर्तनों को हटाने के लिए Mercurial में कोई तरीका है? मेरे पास एक भंडार है जो 60 जीबी है और यह क्लोन करने के लिए बहुत दर्दनाक बनाता है। मैं एक निश्चित तारीख से पहले सब कुछ ट्रिम करना चाहता हूं और भारी डेटाबेस को धूल इकट्ठा करने के लिए दूर रखना चाहता हूं।Mercurial इतिहास हटाएं

+0

कौन सी फाइलें बड़ी हैं? – tonfa

+1

यह उस बड़े से कैसे शुरू हुआ? – Santa

+12

यदि जेक में कोई बाइनरी फाइलें हैं (जो कभी-कभी जरूरी होती हैं ... सभी बाइनरी फाइल स्रोत द्वारा उत्पन्न नहीं होती हैं), तो उस फ़ाइल में प्रत्येक छोटे बदलाव के परिणामस्वरूप रेपो में बनाई गई एक नई प्रतिलिपि होती है। फ़ाइल के आकार या परिवर्तन की आवृत्ति के आधार पर, 60 जीबी की तरह कुछ ऐसा नहीं लग सकता है। – bobpaul

उत्तर

27

आप इसे कर सकते हैं, लेकिन ऐसा करने में आप सभी क्लोन को अमान्य कर देते हैं, इसलिए आम तौर पर ऐसा करने के लिए बुद्धिमान नहीं है जब तक आप पूरी तरह से अकेले काम नहीं कर रहे हों।

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

यदि आप नए बदलावों के हैंश को बदलने के साथ ठीक हैं (जो फिर जंगली में सभी क्लोन को तोड़ देता है) तो आप आदेशों के साथ ऐसा कर सकते हैं;

hg export -o 'changeset-%R.patch' 400:tip # changesets 400 through the end for example 
cd /elsewhere 
hg init newrepo 
cd newrepo 
hg import /path/to/the/patches/*.patch 

आप शायद changesets विलय को संभालने के लिए एक छोटे से काम करने के लिए होगा, लेकिन है कि आम विचार है।

कोई भी hg convert का उपयोग कर hg के साथ स्रोत और गंतव्य प्रकार दोनों के रूप में और splicemap दोनों का उपयोग करके ऐसा कर सकता है, लेकिन यह शायद अभी तक अधिक शामिल है।

बड़ा सवाल यह है कि आप 60 जीबी स्रोत कोड कैसे टाइप करते हैं, या आप सभी सलाह के खिलाफ जेनरेट की गई फाइलें जोड़ रहे थे। :)

+0

मेरे (हटाए गए) उत्तर से अधिक विस्तृत प्रतिक्रिया। +1 – VonC

+0

मैं एक अन्य स्रोत नियंत्रण प्रणाली से आयात कर रहा हूं एक परियोजना जिसमें उत्पन्न बाइनरी शामिल हैं। हम अभी स्रोत नियंत्रण से बाहर डीएल प्राप्त करने की कोशिश कर रहे हैं। सहायता के लिए धन्यवाद! –

+2

उत्तर में एक टाइपो है। फ़ाइल नाम में लोअरकेस% आर (शून्य-गद्देदार संख्याएं) होनी चाहिए अन्यथा फ़ाइलों को सही क्रम में संसाधित नहीं किया जाएगा जब आप उन्हें आयात करते हैं। – Gili

44

इसे सीधे मौजूदा भंडार में करने का कोई आसान/अनुशंसित तरीका नहीं है।

आप फिर भी एक नया तेज रेपो करने के लिए अपने तेज रेपो "कन्वर्ट" और जहां convert.hg.startrev विकल्प

hg convert --config convert.hg.startrev=1234 <source-repository> <new-repository-name> 

नई रेपो सब कुछ शामिल होंगे के माध्यम से बाद के इतिहास को शामिल करने से एक संशोधन चयन कर सकते हैं प्रारंभिक संशोधन से पहले मूल रेपो शून्य से इतिहास।

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

मैंने इसे हमारी कंपनी के भीतर आंतरिक रूप से उपयोग किए जाने वाले पुराने रिपोज़ को साफ़ करने के लिए उपयोग किया - अनचाहे फ़ाइलों को हटाने के लिए --filemap विकल्प के साथ संयुक्त।

+0

तो यह समाधान .hg/subdirectory को हटाने और hg करने से अलग कैसे है इस में? – grzaks

+0

क्षमा करें, मुझे आपकी टिप्पणी समझ में नहीं आ रही है। स्थानीय .hg dir और hg init को रिपोजिटरी से परिवर्तनों को हटाने के साथ क्या करना है? –

+4

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

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