version control - क्या मर्क्यूरियल में किसी एकल फ़ाइल के लिए इतिहास को हटाने का कोई तरीका है?




version-control mercurial (4)

इसे 10 मिनट से कम में किया जा सकता है। एक एकल भंडार में, हालांकि परिणाम हैं।

कैसे: hg कन्वर्ट का उपयोग jitbit.com/alexblog/232-removing-files-from-mercurial-history में वर्णित है। मूल रूप से, आप एक Hg रेपो को एक नए Hg रेपो में "रूपांतरित" करते हैं, लेकिन रूपांतरण के दौरान आपको फ़ाइलों की सूची निर्दिष्ट करनी होगी। यह प्रमुख चरणों का एक अंश है:

Make sure all your teammates have pushed their local changes to the central repo (if any)
Backup your repository
Create a "map.txt" file:

# this filemap is used to exclude specific files
exclude "subdir/filename1.ext"
exclude "subdir/filename2.ext"
exclude "subdir2"

Run this command:
hg convert --filemap map.txt c:/oldrepo c:/newrepo
NOTE: You have to use "forward-slash" in paths, even on windows.
Wait and be patient
Now you have a new repo at c:\newrepo but without the files

परिणाम के लिए के रूप में ...

  • आपके द्वारा जोड़ी गई फ़ाइलों को बाहर करने के बाद सभी बदलाव आईडी अलग-अलग होंगे
  • नए "स्वच्छ" मुख्य भंडार को मौजूदा एक के स्थान पर मैन्युअल रूप से डालना होगा
  • सभी टीम के सदस्यों को मुख्य रेपो के नए क्लोन बनाने होंगे
  • किसी भी अन्य सेवाएं जो एचजी के साथ एकीकृत होती हैं, उन्हें ध्यान देने की आवश्यकता हो सकती है (उदाहरण के लिए समस्या ट्रैकर, एक कोड समीक्षा प्रणाली आदि)

मुझे लगता है कि मुझे पहले से ही इसका जवाब पता है, लेकिन मैंने सोचा कि मैं वैसे भी पूछूंगा:

हमारे पास एक फ़ाइल है जो इसमें संवेदनशील जानकारी के साथ एक व्यापारिक भंडार में जोड़ी गई है। क्या पूरे रेपो को हटाए बिना इसके परिवर्तन के इतिहास के साथ-साथ उस फ़ाइल को हटाने का कोई तरीका है?


एचजी प्रत्यारोपण, फिर एचजी पट्टी


यह सही है कि आप आसानी से किसी विशेष फ़ाइल को इस अर्थ में मर्क्यूरियल से नहीं निकाल सकते कि ऐसा करने से आपकी रिपॉजिटरी में सभी परिवर्तन आईडी को बाधित हो जाएगा। जब आप बदलाव आईडी बदलते हैं, तो हर किसी को रिपॉजिटरी को फिर से क्लोन करना पड़ता है। मर्क्यूरियल में इतिहास को संशोधित करने के परिणामों की जानकारी के लिए इतिहास संपादित करने के बारे में विकी पृष्ठ देखें।

यदि आपके लिए यह ठीक है (एक कंपनी में आंतरिक भंडार), तो कन्वर्ट एक्सटेंशन पर एक नज़र डालें। यह hg → hg रूपांतरण कर सकता है और इसमें एक --filemap तर्क होता है जिसका उपयोग अन्य चीजों के अलावा, फ़ाइलों को बाहर करने के लिए किया जा सकता है।


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

उस ने कहा, मैंने अपनी एक रिपॉजिटरी से एक फ़ाइल निकालने के लिए मर्क्यूरियल विकी पर वर्णित संपादन इतिहास अनुक्रम का पालन किया है। यह अनुक्रम मानता है कि संशोधन 1301: 5200a5a10d8b ने फ़ाइल path/to/badfile.cfg , जिसे बाद के किसी भी संशोधन में नहीं बदला गया था:

  1. अपने .hgrc में MQ एक्सटेंशन सक्षम करें:

    [extensions]
    mq =
    
  2. ऊपर से हाल के बदलावों को खींचिए।

    hg pull
    
  3. MQ में फ़ाइल अतिरिक्त से सब कुछ आयात करें:

    hg qimport -r 1301:tip
    hg qpop -a
    
  4. फाइल को उस कमिट से निकालें जिसने इसे जोड़ा है।

    hg qpush 1301.diff
    hg forget path/to/badfile.cfg
    hg qrefresh
    
  5. पैच को नए मर्क्यूरियल रिविजन में बदलें।

    hg qpush -a
    hg qfinish -a
    
  6. नए संशोधनों को ऊपर की ओर धकेलें।

    hg push -f
    
  7. अपस्ट्रीम रिपॉजिटरी और हर एक अन्य कॉपी पर, पुराने संशोधनों को हटा दें।

    hg strip 5200a5a10d8b
    

चेतावनी : जब तक आप सावधान रहें, यह कदम काम को नष्ट कर सकता है। यदि किसी ने पिछली बार आपके द्वारा ऊपर की ओर खींचे जाने के बाद से कुछ भी किया है, तो आपको स्ट्रिपिंग से पहले उस काम को फिर से करना होगा। दुर्भाग्य से, rebase विस्तार यहां मददगार नहीं है; आपको एमक्यू का फिर से उपयोग करना होगा, नए कमिट को उन पैच में परिवर्तित करना होगा जो आप नए सिरे से लागू करते हैं।

सौभाग्य।






dvcs