Git: ऐतिहासिक कमिट से फ़ाइल कैसे निकालें?


113

मैंने आईडी 56f06019 (उदाहरण के लिए) के साथ प्रतिबद्ध किया है। उस प्रतिबद्ध में मैंने गलती से बड़ी फाइल (50Mb) शुरू कर दी है। एक अन्य कमिट में मैं एक ही फाइल जोड़ता हूं लेकिन सही आकार (छोटा) में। अब मेरा रेपो जब मैं क्लोन बहुत भारी है :( रेपो इतिहास से उस बड़ी फाइल को कैसे हटाऊं ताकि मेरे रेपो का आकार कम हो सके?


मेरे मामले में, यह एक बड़ी फ़ाइल नहीं है, लेकिन डेटाबेस क्रेडिट युक्त कॉन्फ़िगरेशन फ़ाइल है। मैं गिट का अध्ययन कर रहा था, उस समय मैं अनभिज्ञ था।
राशी


जवाबों:


165

प्रो गिट पुस्तक के अध्याय 9 में वस्तुओं को हटाने पर एक अनुभाग है ।

मुझे यहाँ संक्षिप्त रूप से चरणों की रूपरेखा दें:

git filter-branch --index-filter \
    'git rm --cached --ignore-unmatch path/to/mylarge_50mb_file' \
    --tag-name-filter cat -- --all

पहले बताए गए रिबासिंग विकल्प की तरह, filter-branchपुनर्लेखन ऑपरेशन है। यदि आपने इतिहास प्रकाशित किया है, तो आपको --forceनए रेफ को धकेलना होगा।

filter-branchदृष्टिकोण की तुलना में काफी अधिक शक्तिशाली है rebaseदृष्टिकोण है, यह बाद से

  • आपको एक ही बार में सभी शाखाओं / रेफरी पर काम करने की अनुमति देता है,
  • मक्खी पर किसी भी टैग का नाम बदल देता है
  • अगर फ़ाइल के जोड़ के बाद से कई मर्ज किए गए हैं तो भी सफाई से काम करता है
  • अगर (ए) शाखा (ईएस) के इतिहास में कई बार फ़ाइल को फिर से जोड़ा / हटाया गया तो भी सफाई से काम करता है
  • नए, असंबंधित कमिट नहीं बनाता है, बल्कि उनसे जुड़े पेड़ों को संशोधित करते हुए उन्हें कॉपी करता है। इसका मतलब है कि हस्ताक्षरित कमिट, कमिट नोट आदि जैसे सामान संरक्षित हैं

filter-branch बैकअप भी रखता है, इसलिए जब तक आप रिफ्लेक्स और कचरा इकट्ठा नहीं करते, रेपो का आकार तुरंत कम नहीं होगा:

rm -Rf .git/refs/original       # careful
git gc --aggressive --prune=now # danger

1
यह ध्यान देने योग्य है कि यह विंडोज़ cmd.exe के तहत काम नहीं करता है। हालांकि, यह ठीक है कि साइबरविन के तहत काम करता है।
फेक नेम

2
मुझे सिंगल-कोट्स (विंडोज सर्वर 2012 cmd.exe पर) के बजाय डबल-कोट्स का उपयोग करके काम करने के लिए उपरोक्त git फिल्टर-ब्रांच
मिली

1
मेरे लिए जो काम किया, वह था फ़िल्टर-शाखा कमांड लाइन। git filter-branch --force --index-filter 'git rm --ignore-unmatch --cached PathTo/MyFile/ToRemove.dll' -- fbf28b005^.. तब rm --recursive --force .git/refs/originalऔर rm --recursive --force .git/logs तब मैंने उपयोग किया git prune --expire now और git gc --aggressive यह मेरे लिए आपके द्वारा ऊपर सूचीबद्ध सटीक चरणों की तुलना में बेहतर काम किया। Git Pro पुस्तक के लिंक को शामिल करने के लिए धन्यवाद, क्योंकि यह अमूल्य था।
dacke.geo

फ़िल्टर-ब्रांच कमांड के बाद, .गित फ़ोल्डर के आकार को प्राप्त करने का एकमात्र तरीका यहां पाया गया कमांड का पालन करना था: stackoverflow.com/questions/1904860/… git -c gc.reflogExpire = 0 -c gc। ReflogExpireUnreachable = 0 -c gc.rereresolved = 0 \ -c gc.rerereunresolved = 0 -c gc.pruneExpire = अब gc "$ @"
स्टीव

रेपो को सिकोड़ने के लिए, मैंने git फ़िल्टर-शाखा doc: git-scm.com/docs/…
लुडोविक राइडर्स


0

आपको इंटरएक्टिव मोड में रीबेट को git करने की आवश्यकता होगी, यहां एक उदाहरण देखें: मैं GitHub पर कमिट कैसे निकाल सकता हूं? और पुराने कमिट को कैसे हटाएं

यदि आपकी प्रतिबद्धता HEAD माइनस 10 पर है तो:

$ git rebase -i HEAD~10

अपने इतिहास के संस्करण के बाद, आपको "नया" इतिहास को आगे बढ़ाने की आवश्यकता है, आपको +बल में जोड़ने की जरूरत है ( पुश विकल्पों में Refspec देखें ):

$ git push origin +master

यदि अन्य लोगों ने पहले से ही आपके भंडार पर क्लोन कर लिया है, तो आप उन्हें सूचित करेंगे, क्योंकि आपने सिर्फ इतिहास को बदल दिया है।


3
यह इतिहास से बड़ी फ़ाइल को नहीं हटाता है। इसके अलावा, पुश को बल देने के लिए विहित तरीका है ( git push --forceया git push -fजिसे लोगों को शाखा पुश लक्ष्य जानने की आवश्यकता नहीं है)
sehe

प्रश्न के आधार पर, नई फ़ाइल बिल्कुल पुरानी फ़ाइल के समान है, अर्थात, समान पथ। यही कारण है कि आप सीधे git rmपथ पर उपयोग नहीं कर सकते ।
Lo atc d'Anterroches

2
@ तो, अगर आप भारी फाइल के साथ कमिटमेंट को खत्म करते हैं, तो यह अच्छा है।
वॉनब्रांड

@vonbrand केवल उस शाखा से जिसे आपने विद्रोह किया था। मुझे लगता है कि 'से' शाखा हट नहीं रही है। लेकिन हाँ, यदि आप एक संशोधन पेड़ की शाखा को हटाते हैं, तो इससे मदद मिलेगी: _
se '

@ हर्ष, निश्चित रूप से, आपको सभी शाखाओं का पीछा करना होगा जिसमें आपत्तिजनक कमेटी है। यदि यह रेपो में कुछ जंगलीपन से पहले है, तो आपके पास करने के लिए बहुत सारे पुनर्गठन होंगे। लेकिन रिबास इसके लिए उपकरण है।
वॉनब्रांड

0

मैंने विंडोज़ https://stackoverflow.com/a/8741530/8461756 पर निम्न उत्तर का उपयोग करने की कोशिश की

एकल उद्धरण खिड़कियों पर काम नहीं करता है, आपको दोहरे उद्धरण चिह्नों की आवश्यकता है।

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

git फ़िल्टर-शाखा --force --index- फ़िल्टर "git rm --cached --ignore-unmatch PathRelativeRepositoryRoot / bigfile.csv" - --all

बड़ी फाइल को हटाने के बाद, मैं अपने बदलावों को जीथब मास्टर के पास पहुंचाने में सक्षम था।


0

आप हटाने के लिए एक साधारण कमांड का उपयोग कर सकते हैं

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