सबसे पहले, आपको एफ़टीपी साइट पर पासवर्ड बदलना चाहिए। पासवर्ड पहले ही सार्वजनिक कर दिया गया है; आप गारंटी नहीं दे सकते कि किसी ने रेपो को क्लोन नहीं किया है, या यह किसी बैकअप में सादे-पाठ में नहीं है, या इस तरह का कुछ है। यदि पासवर्ड सभी मूल्यवान है, तो मैं अब तक समझौता करने पर विचार करता हूं।
अब, इतिहास को संपादित करने के तरीके के बारे में आपके प्रश्न के लिए। इस उद्देश्य के लिए git filter-branch
कमांड का उद्देश्य है; यह आपके भंडार के इतिहास में प्रत्येक प्रतिबद्धता के माध्यम से चलता है, इसे संशोधित करने के लिए एक आदेश लागू करता है, और फिर एक नई प्रतिबद्धता बनाते हैं।
विशेष रूप से, आप git filter-branch --tree-filter
चाहते हैं। यह आपको प्रत्येक प्रतिबद्धता के लिए पेड़ (वास्तविक फ़ाइलें और निर्देशिका) की सामग्री को संपादित करने की अनुमति देता है। यह पूरे पेड़ वाली निर्देशिका में एक कमांड चलाएगा, आपका आदेश फाइलों को संपादित कर सकता है, नई फाइलें जोड़ सकता है, फाइलों को हटा सकता है, उन्हें ले जा सकता है, और इसी तरह। गिट फिर एक ही मेटाडाटा (संदेश, तिथि, और इसी तरह) को पिछले एक के रूप में एक नई प्रतिबद्ध वस्तु बना देगा, लेकिन आपके आदेश द्वारा संशोधित पेड़ के साथ, नई फाइलों को जोड़ना, फाइलों को हटाए जाने के रूप में गायब करना, आदि (इसलिए, आपके आदेश को git add
या git rm
करने की आवश्यकता नहीं है, इसे केवल पेड़ को संशोधित करने की आवश्यकता है)।
अपने उद्देश्यों के लिए, की तरह कुछ निम्नलिखित उचित नियमित अभिव्यक्ति के साथ, काम करते हैं और नाम दर्ज करनी चाहिए अपने सटीक स्थिति के आधार पर:
git filter-branch --tree-filter "sed -i -e 's/SekrtPassWrd/REDACTED/' myscript.py" -- --all
अपने भंडार की एक प्रति के लिए यह करने के लिए याद रखें, यदि ऐसा है तो कुछ गलत हो जाता है, आपके पास अभी भी मूल होगा और फिर से शुरू हो सकता है। filter-branch
आपकी मूल शाखाओं के संदर्भों को भी सहेज देगा, original/refs/heads/master
और इसी तरह, इसलिए यदि आप ऐसा करना भूल जाते हैं तो भी आपको पुनर्प्राप्त करने में सक्षम होना चाहिए; मेरे स्रोत कोड इतिहास में कुछ वैश्विक संशोधन करते समय, मुझे यह सुनिश्चित करना अच्छा लगता है कि कुछ गलत होने पर मेरे पास कई फ़ॉलबैक हैं।
कि यह कैसे काम करता है और अधिक विस्तार से व्याख्या करने के लिए:
sed -i -e 's/SekrtPassWrd/REDACTED/' myscript.py
यह REDACTED
के साथ अपने myscript.py
फ़ाइल में SekrtPassWrd
का स्थान ले लेगा; -i
विकल्प sed
विकल्प को फ़ाइल को संपादित करने के लिए कहता है, बिना बैकअप फ़ाइल के (जैसा कि बैकअप को नई फ़ाइल के रूप में गिट द्वारा उठाया जाएगा)।
यदि आपको एक प्रतिस्थापन से कुछ अधिक जटिल करने की आवश्यकता है, तो आप एक स्क्रिप्ट लिख सकते हैं, और बस अपने आदेश के लिए इसे आमंत्रित कर सकते हैं; बस इसे पूर्ण पथनाम के साथ कॉल करना सुनिश्चित करें, git filter-branch
एक अस्थायी निर्देशिका के भीतर से अपना आदेश कॉल करें।
git filter-branch --tree-filter <command> -- --all
यह git
बताता है एक पेड़ फिल्टर, जैसा कि ऊपर अपने भंडार में वर्णित है, हर शाखा पर चलाने के लिए। -- --all
भाग गिट को सभी शाखाओं में इसे लागू करने के लिए कहता है; इसके बिना, यह केवल वर्तमान शाखा के इतिहास को संपादित करेगा, अन्य सभी शाखाओं को अपरिवर्तित छोड़ देगा (जो शायद आप जो चाहते हैं वह नहीं है)।
गिटहब पर धक्का दी गई जानकारी की प्रतियों से निपटने के बारे में कुछ और जानकारी के लिए Removing Sensitive Data (originally pointed out by MBO पर) GitHub पर दस्तावेज़ देखें। ध्यान दें कि वे अपना पासवर्ड बदलने के लिए मेरी सलाह दोहराते हैं, और गिटहब के पास कैश की गई प्रतियों से निपटने के लिए कुछ सुझाव प्रदान करते हैं।
http://stackoverflow.com/questions/2004024/how-to- स्थायी रूप से-delete-a-file-stored-in-git – Thomas
@ थॉमस - डुप्ली नहीं, यह प्रश्न फ़ाइल को हटाने के बारे में है। मैं केवल एक फ़ाइल में एक लाइन को हटाना चाहता हूँ। – Skilldrick
ठीक है, यह सवाल एक डुप्ली नहीं है। दूसरा सवाल एक पूरी फाइल को हटाने के बारे में है, जहां उत्तर 'गीट फ़िल्टर-शाखा - इंडेक्स-फ़िल्टर' का उपयोग करना है। फ़ाइल में किसी लाइन को हटाने या संशोधित करने के मामले में, आपको 'गिट फ़िल्टर-शाखा - ट्री-फ़िल्टर' की आवश्यकता होती है। –