2010-01-21 10 views
14

में प्रतिक्रिया ने हाल ही में एफ़टीपी के लिए थोड़ी पायथन लिपि पर काम करना शुरू कर दिया। शुरू करने के लिए, मेरे पास स्क्रिप्ट में हार्ड एफ़टीपी साइट के लिए सर्वर, लॉगिन और पासवर्ड विवरण था, लेकिन इससे कोई फर्क नहीं पड़ता क्योंकि मैं केवल स्थानीय स्तर पर काम कर रहा था।गिट

तब मुझे परियोजना को जिथब पर डालने का प्रतिभाशाली विचार था। मुझे जल्द ही मेरी गलती का एहसास हुआ, और कठोर विवरणों को .netrc से जुड़े समाधान के साथ बदल दिया। मैंने अब परियोजना को जिथब से हटा दिया है, क्योंकि कोई भी इतिहास देख सकता है, और सादा पाठ में लॉगिन विवरण देख सकता है।

सवाल यह है कि क्या गिट इतिहास के माध्यम से जाने और उपयोगकर्ता नाम और पासवर्ड को हटाने का कोई तरीका है, लेकिन अन्यथा इतिहास को बरकरार छोड़ दें? या मुझे इतिहास के साथ एक नया रेपो शुरू करने की ज़रूरत है?

+0

http://stackoverflow.com/questions/2004024/how-to- स्थायी रूप से-delete-a-file-stored-in-git – Thomas

+0

@ थॉमस - डुप्ली नहीं, यह प्रश्न फ़ाइल को हटाने के बारे में है। मैं केवल एक फ़ाइल में एक लाइन को हटाना चाहता हूँ। – Skilldrick

+0

ठीक है, यह सवाल एक डुप्ली नहीं है। दूसरा सवाल एक पूरी फाइल को हटाने के बारे में है, जहां उत्तर 'गीट फ़िल्टर-शाखा - इंडेक्स-फ़िल्टर' का उपयोग करना है। फ़ाइल में किसी लाइन को हटाने या संशोधित करने के मामले में, आपको 'गिट फ़िल्टर-शाखा - ट्री-फ़िल्टर' की आवश्यकता होती है। –

उत्तर

21

सबसे पहले, आपको एफ़टीपी साइट पर पासवर्ड बदलना चाहिए। पासवर्ड पहले ही सार्वजनिक कर दिया गया है; आप गारंटी नहीं दे सकते कि किसी ने रेपो को क्लोन नहीं किया है, या यह किसी बैकअप में सादे-पाठ में नहीं है, या इस तरह का कुछ है। यदि पासवर्ड सभी मूल्यवान है, तो मैं अब तक समझौता करने पर विचार करता हूं।

अब, इतिहास को संपादित करने के तरीके के बारे में आपके प्रश्न के लिए। इस उद्देश्य के लिए 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 पर दस्तावेज़ देखें। ध्यान दें कि वे अपना पासवर्ड बदलने के लिए मेरी सलाह दोहराते हैं, और गिटहब के पास कैश की गई प्रतियों से निपटने के लिए कुछ सुझाव प्रदान करते हैं।

+2

यह बहुत उपयोगी है, बहुत बहुत धन्यवाद। पासवर्ड बदलने के बारे में भी नोट - मुझे जरूरी है कि गधे को मार डालो, चीयर्स। – Skilldrick

+1

सहायक, धन्यवाद। – blindsnowmobile

+1

मैं बैकअप फ़ाइलों को "-e" प्रत्यय के साथ अपने सभी काम करता हूं (यानी, "Video.swift" और "Video-e.swift")। इसे ठीक करने के लिए, मुझे '-i' विकल्प के बाद '' '(दो सिंगल कोट्स) जोड़ना पड़ा। तो पूरा आदेश 'गिट फ़िल्टर-शाखा - ट्री-फिल्टर "sed -i''ee/SekrtPassWrd/Redacted/'myscript.py" - --all' था। 'मैन sed'' की जांच करना यह कहता है कि '-i' विकल्प ध्वज के बाद प्रदान किए गए प्रत्यय के साथ एक बैकअप फ़ाइल बनाएगा जब तक कि खाली मूल्य नहीं दिया जाता है। – donut

3

मुझे विश्वास है कि आप filter-branch कमांड का उपयोग कर अपने सभी कामों को बदलने में सक्षम होना चाहिए। विवरण के लिए the section in the ProGit book देखें।

हालांकि

, के रूप में @MBO लिंक नोटों

बल धकेलने दूरस्थ रेपो पर प्रतिबद्ध मिटा नहीं है, यह बस नए लोगों का परिचय और उन्हें

को इंगित करने के शाखा सूचक ले जाता है इसलिए आपको उन चीजों को हटाने के लिए गिटहब से पूरी तरह से रिपोजिटरी को हटाना होगा (यानी यदि वे आपके प्रतिबद्ध इतिहास में नहीं हैं, फिर भी वे भंडार में चारों ओर तैर रहे हैं)

5

शायद ch एफ़टीपी साइट पर अपना पासवर्ड एंज करें? जब तक आप कोड से शर्मिंदा न हों ...

+1

+1, भले ही वह गिट इतिहास से फ़ाइल को सफलतापूर्वक हटा देता है, पासवर्ड और संबंधित खाते को समझौता किया जाना चाहिए। – Kevin

1

chosen answer@Brian Campbell पर जोड़ने के लिए, मुझे अपने उपयोग के मामले में उनके कोड के साथ समस्याएं थीं। मैं बस पहले की काम में सवाल में फाइल लापता था। मुझे यकीन है कि मैं केवल एक ही व्यक्ति इस स्थिति में तो मैं उन्हें आसानी से ठीक किया जाता नहीं कर रहा हूँ/हैक

git filter-branch --tree-filter "sed -i -e 's/SekrtPassWrd/REDACTED/' myscript.py || echo 'fail'" -- --all 

सभी मैं भी जब फ़ाइल में नहीं मिला था चालू रखने के हैं कोड का बीमा करने के || echo 'fail' जोड़ने था प्रतिबद्ध हूँ । मुझे आशा है कि किसी और को यह उपयोगी लगेगा या लापता फाइलों को संभालने की बेहतर विधि के साथ जवाब दे सकता है। मेरे पास पर्याप्त प्रतिनिधि नहीं है इसलिए मुझे एक नया जवाब देना पड़ा।