Git हिस्ट्री से फाइल कैसे निकाले?


91

कुछ समय पहले मैंने जानकारी (फाइलें) जोड़ी थी जो निजी होनी चाहिए। परियोजना से हटाना समस्या नहीं है, लेकिन मुझे इसे हटाने की भी आवश्यकता हैgit इतिहास ।

मैं Git और Github (निजी खाता) का उपयोग करता हूं।

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


3
आपको इतिहास को फिर से लिखना होगा। उदाहरण के लिए git rebaseतोgit push -f
कोरी क्रेमर


filter-branchविधि सुझाव दो प्रतियों में वर्णित है कि तुम क्या चाहते हो जाएगा।
1615903

इसके अलावा stackoverflow.com/a/17890278 जो BFG को इंगित करता है जो कि उपयोग करने से तेज हो सकता हैgit filter-branch
Hasturkun

लेकिन बस तेज़ी से आगे बढ़ें और ऐसा ही करें, और जावा का उपयोग करने की आवश्यकता है I @Hasturkun
Marcos R. Guevara

जवाबों:


115

मुझे यह उत्तर मिल गया है और इसने मदद की:

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch path_to_file" HEAD

यह यहां पाया https://myopswork.com/how-remove-files-completely-from-git-repository-history-47ed3e0c4c35


5
चेतावनी: यह एक टन बनाता है और विचलन का कारण बनता है। आपको शायद बाद में पुश करने के लिए मजबूर करना होगा, लेकिन मैं बहुत डर गया था।
सूदो ५

1
@Sudo ने जो कहा, उस पर काम करते हुए, लेकिन इसने मेरी नई शाखा के लिए काम किया जो मैंने गलती .envसे किया था। त्वरित और बिंदु समाधान के लिए।
जो स्कॉटो

1
दरअसल, एक साधारण बल धक्का काम करता है! मैं भी डर गया था लेकिन सब कुछ वापस कर दिया।
wutBruh

1
आप अंतिम तर्क के रूप में कमिट की एक सीमा भी निर्दिष्ट कर सकते हैं। यदि प्रश्न में प्रतिबद्ध हाल ही में था, तो <previous_hash>..HEADकुछ समय के लिए करें और बचाएं।
विक्टर सर्जेनको

इसके बाद यह केवल मेरे लिए काम करता हैgit push --force
सेबस्टियन श्मेल

49

यदि आपने हाल ही में उस फ़ाइल को कमिट किया है, या यदि वह फ़ाइल एक या दो कमिट में बदल गई है, तो मैं आपको उपयोग करने rebaseऔर cherrypickउस विशेष कमिट को हटाने का सुझाव दूंगा।

अन्यथा, आपको पूरे इतिहास को फिर से लिखना होगा।

git filter-branch --tree-filter 'rm -f <path_to_file>' HEAD

जब आप परिवर्तनों से संतुष्ट होते हैं और यह सुनिश्चित करते हैं कि सब कुछ ठीक लगता है, तो आपको सभी दूरस्थ शाखाओं को अपडेट करने की आवश्यकता है -

git push origin --force --all

नोट: - यह एक जटिल ऑपरेशन है, और आपको पता होना चाहिए कि आप क्या कर रहे हैं। पहले इसे डेमो रिपॉजिटरी पर करने की कोशिश करें कि यह कैसे काम करता है। आपको अन्य डेवलपर्स को भी इसके बारे में बताने की आवश्यकता है, जैसे कि वे उस समय में कोई बदलाव नहीं करते हैं।


पूरे इतिहास को फिर से लिखने के बाद, रिपॉजिटरी (गीथब) में बदलाव के लिए क्या करना चाहिए?
मार्कोस आर। ग्वेरा

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

गलती से, मैं जोड़ना भूल गया --all। अब यह सब कुछ अप-टू-डेट कहता है, जब भी मैं दोनों तर्कों के साथ पुनर्मिलन करता हूं। और फ़ाइल को अन्य शाखाओं से हटाया नहीं गया है। अब मुझे क्या करना चाहिए?
ऋषभ रंजन

@ PetroFranko के उत्तर के --tree-filterबजाय आपके सुझाव का उपयोग क्यों होता है --index-filter?
einpoklum

14
  • फ़ाइल को हटा दें और हटाए गए फ़ाइल के साथ किए गए इतिहास को फिर से लिखें

    git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' --prune-empty --tag-name-filter cat -- --all

  • अब बल रेपो को धकेलें:

    git push origin --force --all

  • अब अपने सहयोगियों को बताएं rebase



7
  • सबसे पहले, इसे अपनी .gitignoreफ़ाइल में जोड़ें और फ़ाइल को कम करना न भूलें :-)
  • आप इस साइट का उपयोग कर सकते हैं: http://gtiignore.io आपके लिए उत्पन्न करने के .gitignoreलिए और अपनी बाइनरी फ़ाइलों / फ़ोल्डर (ओं) के लिए आवश्यक पथ जोड़ने के लिए

  • एक बार जब आप फ़ाइल जोड़ते हैं, .gitignoreतो आप "पुरानी" बाइनरी फ़ाइल को बीएफजी के साथ हटा सकते हैं।


How to remove big files from the repository

आप उपयोग git filter-branchया BFG कर सकते हैं । https://rtyley.github.io/bfg-repo-cleaner/

BFG Repo-Cleaner

गिट-फिल्टर-शाखा का एक विकल्प।

बीएफजी एक सरल, खराब डेटा को साफ करने के लिए गिट-फिल्टर-शाखा का तेज विकल्प है से अपने गिट रिपॉजिटरी की किताब से

* क्रेजी बिग फाइल्स को
हटाना * * पासवर्ड, क्रेडेंशियल्स और अन्य निजी डेटा को हटाना

उदाहरण (आधिकारिक साइट से)

इन सभी उदाहरणों में bfg जावा -जर bfg.jar के लिए एक उपनाम है।

# Delete all files named 'id_rsa' or 'id_dsa' :
bfg --delete-files id_{dsa,rsa}  my-repo.git

यहाँ छवि विवरण दर्ज करें


6

मैंने इस GitHub लेख को पढ़ा , जिसने मुझे निम्नलिखित कमांड पर ले जाया (स्वीकृत उत्तर के समान, लेकिन थोड़ा और अधिक मजबूत):

git filter-branch --force --index-filter "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" --prune-empty --tag-name-filter cat -- --all

4

गिट-रेपो-फिल्टर

gitgit-filter-repo (जब git filter-branchकमांड निष्पादित हो) का उपयोग करने की अनुशंसा करता है । अन्य विकल्पों ( https://github.com/newren/git-filter-repo#why-filter-repo-instead-of-other-alternatives) की तुलना में यह बेहतर क्यों है, इसकी एक लंबी सूची है ) की , मेरा अनुभव यह है कि यह बहुत सरल है और बहुत तेज है।

यह कमांड सभी ब्रांचों की फाइल को सभी शाखाओं से हटा देती है:

git filter-repo --path <path to the file or directory> --invert-paths

कई --pathमापदंडों का उपयोग करके कई पथ निर्दिष्ट किए जा सकते हैं । आप यहाँ विस्तृत दस्तावेज़ पा सकते हैं: https://www.mankier.com/1/git-filter-repo

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