2015-08-24 8 views
5

मैंने गलती से ऐसा कुछ किया जो गिट (केवल स्थानीय रूप से) में संवेदी जानकारी हो सकता है और मैं इसे गिट इतिहास से सरल तरीके से हटा देना चाहता हूं।क्या गिट रीसेट इतिहास हटा देता है?

git reset --soft HEAD~1 

और फिर sensetive जानकारी unstage और gitignore को पूरी तरह से Git इतिहास से निकालने के लिए पर्याप्त हो जोड़ देगा?

उत्तर

4

नहीं, मुलायम रीसेट पर्याप्त नहीं है। ऐसा करने से फ़ाइल को आपकी अनुक्रमणिका में छोड़ दिया जाएगा (जहां आप फ़ाइलों को प्रतिबद्ध करने के लिए चरणबद्ध करते हैं)। इसका मतलब है कि वह गिट अभी भी फाइल को ट्रैक कर रहा है।

आप एक मिश्रित रीसेट करना चाहते हैं, जो इन फ़ाइलों को भी अस्थिर करता है। जैसा कि रेने ने बताया, फ़ाइल को हटाने या इसे अपने .gitignore में जोड़ने का भी एक अच्छा विचार है, इसलिए आप इसे फिर से गलती से नहीं करते हैं।

यह पर्याप्त है इसलिए संवेदनशील जानकारी git push पर रिमोट सर्वर पर प्रेषित नहीं की जाएगी।

हालांकि, जानकारी अभी भी आपके स्थानीय भंडार में है। यदि आपने गलती से बहुत दूर रीसेट करके एक प्रतिबद्धता को "ढीला" किया है, तो git reflog एक बहुत ही उपयोगी टूल है।

अब सभी दूर सब करता है कि एक शाखा या टैग के माध्यम से पहुंच योग्य नहीं हैं साफ करने के लिए:

git reflog expire --expire=1.minute --all 
git prune 
git gc 
  1. सभी प्रविष्टियों को निकालता है reflog से अधिक उम्र के 1 मिनट। यदि कोई शेष संदर्भ है तो एक प्रतिबद्धता को हटाया नहीं जाएगा। ऐसा संदर्भ किसी अन्य प्रतिबद्धता, एक शाखा, एक टैग और रीफ्लॉग से भी आ सकता है।
  2. उन सभी कामों को हटा देता है जो अब पहुंच योग्य नहीं हैं।
  3. कई हाउसकीपिंग कार्य करता है। अधिक जानकारी के लिए documentation

reflog expire को देखो और prune विनाशकारी संचालन कर रहे हैं। मैं इन आदेशों को --dry-run तर्क के साथ पहले चलाने की सलाह देता हूं, यह देखने के लिए कि वास्तव में क्या हटाया जाता है।

2

--soft की आवश्यकता नहीं: git reset HEAD~1 चलती हेड के अतिरिक्त इंडेक्स को रीसेट करके वर्तमान प्रतिबद्ध फ़ाइलों को अस्थिर कर देगा।

फिर .gitignore उस फ़ाइल को अनदेखा करने के लिए पर्याप्त होगा।

क्या आपका मतलब है कि मुझे पहले git reset --soft HEAD~1 और फिर git reset HEAD <file> करना चाहिए?

नहीं, आपको यह सुनिश्चित करने के लिए सभी प्रतिबद्धताओं को हटाने की आवश्यकता है कि इतिहास में आपकी संवेदनशील फ़ाइल शामिल नहीं होगी।

git reset HEAD~1 
echo sensitiveFile >> .gitignore 
git add .gitignore 
git add -A . 
git commit -m "Redo commit, without sensitiveFile" 
+0

मेरा उदाहरण पर्याप्त क्यों नहीं है? गिट रीसेट HEAD इतिहास से फ़ाइल को हटा देता है, है ना? क्या वह पर्याप्त नहीं है? – Mattias

+0

@ मैटियास 'गीट रीसेट HEAD - ' केवल एक फ़ाइल रीसेट करें, लेकिन वर्तमान प्रतिबद्धता को परिवर्तित नहीं करता है (जिसमें अभी भी आपकी संवेदनशील फ़ाइल शामिल है)। आप अपनी फ़ाइल के बिना एक नया प्रतिबद्ध करने में सक्षम होंगे, लेकिन इतिहास (पिछला प्रतिबद्ध) अभी भी संवेदनशील फ़ाइल का संदर्भ देगा। इसे इतिहास से वास्तव में हटाने के लिए, आपको केवल पिछली प्रतिबद्धता को फिर से करने की आवश्यकता है, न केवल फ़ाइल। – VonC

+0

यदि मैं 'गिट रीसेट - सॉफ्ट हेड ~ 1' करता हूं, जो पिछली प्रतिबद्धता को रीसेट कर देगा (संवेदनात्मक फ़ाइल को एक से पहले किया गया था), और फिर 'गीट रीसेट HEAD - ' करें, जो संवेदना को हटा देगा गिट इंडेक्स से फ़ाइल, क्या मुझे सटीक परिणाम नहीं मिलेंगे क्योंकि 'गीट रीसेट हेड ~ 1' कर रहा है सिवाय इसके कि मैं सभी गैर-संवेदी फाइलों को इंडेक्स में रखता हूं? – Mattias

2

git reset --soft HEAD~1 फिर सेट करता है केवल HEAD पिछले करने के लिए प्रतिबद्ध है, जबकि सूचकांक और कार्यशील निर्देशिका को छुआ नहीं है।

इसका मतलब है कि अनुक्रमणिका और कार्यशील निर्देशिका अभी भी उस स्थिति को प्रतिबिंबित करती है जिसमें संवेदनशील जानकारी होती है। बस इन फ़ाइलों को इंडेक्स git reset HEAD <file>... से हटा दें और फिर से प्रतिबद्ध करें।

इंडेक्स से संवेदनशील डेटा फ़ाइलों को हटाने के बाद, वे कार्यशील निर्देशिका में बने रहेंगे। हो सकता है कि आप उन्हें कार्यशील निर्देशिका से हटाना चाहें या उन्हें .gitignore पर जोड़ें।

संपादित

तुम्हारा मतलब मैं पहली बार Git रीसेट --soft HEAD ~ 1 और फिर Git रीसेट HEAD क्या करना चाहिए?

हां। आम तौर पर आप git add .. फ़ाइलें लेते हैं और फिर उन्हें प्रतिबद्ध करते हैं। यदि आप git reset --soft HEAD~1 करते हैं तो आपका संग्रह उस प्रतिबद्धता से पहले राज्य को प्रतिबिंबित करता है। यदि आप git status करते हैं तो आप इसे देख सकते हैं। तो आप इंडेक्स को संशोधित कर सकते हैं और फिर से प्रतिबद्ध कर सकते हैं।

इसके अलावा, क्या यह डेटा गिट इतिहास से 100% हटा देता है?

नहीं, पूरी तरह से नहीं। यदि किसी प्रतिबद्धता का संदर्भ नहीं दिया जाता है तो गिट 90 दिनों के बाद इसे हटा देगा (डिफ़ॉल्ट मान - git gc देखें)। यदि आप इसे तुरंत हटाना चाहते हैं, तो आपको यह सुनिश्चित करना होगा कि अब इसका संदर्भ नहीं दिया गया है। इसलिए आपको इसे किसी भी रिफ्लॉग से हटाना होगा जिसमें यह शामिल है, उदा। git reflog --delete [email protected]{3}। आम तौर पर यह HEAD और आपकी शाखा के रेफ्लॉग में निहित होगा। यह भी सुनिश्चित करें कि यह किसी भी शाखा में शामिल नहीं है, उदा। यदि प्रतिबद्धता A है git branch -a --contains A करें। आउटपुट खाली होना चाहिए।

फिर आप git gc --prune=now का उपयोग करके इसे कचरा इकट्ठा कर सकते हैं। जांचें कि git log -n1 COMMIT-ID का उपयोग करके प्रतिबद्धता हटा दी गई है। इसे fatal: bad object आउटपुट करना चाहिए।

फाइलों को हटाने और गिट से सख्त सामग्री के विवरण के लिए मेरे ब्लॉग https://www.link-intersystems.com/blog/2014/07/17/remove-directories-and-files-permanently-from-git/ पर एक नज़र डालें।

+0

क्या आपका मतलब है कि मुझे पहले गिट रीसेट करना चाहिए - सॉफ्ट हेड ~ 1 और फिर गीट रीसेट HEAD ? साथ ही, क्या यह गिट इतिहास से डेटा 100% हटा देता है? बस सुनिश्चित करना चाहते हैं। – Mattias

संबंधित मुद्दे