यदि कोई फ़ाइल .gitignore से मेल खाने के बावजूद Git द्वारा लगातार दिखाई जा रही है, तो स्थानीय कॉपी को वहीं रहने देते हुए उसे Git के इंडेक्स से हटा दें। Terminal में, रिपॉजिटरी पर जाएं, git rm --cached -- "path/to/file" चलाएं, फिर उस स्टेड रिमूवल और इग्नोर नियम को कमिट करें। Git के दस्तावेज़ इसकी पुष्टि करते हैं कि इग्नोर नियम अनट्रैक्ड फ़ाइलों को प्रभावित करते हैं; वे इंडेक्स में पहले से मौजूद फ़ाइलों की ट्रैकिंग बंद नहीं करते हैं। (Git gitignore दस्तावेज़)
.gitignore ने फ़ाइल को ट्रैक करना बंद क्यों नहीं किया है
एक .gitignore पैटर्न Git को मेल खाने वाले अनट्रैक्ड पाथ्स को अनदेखा करने के लिए कहता है। यदि कोई फ़ाइल पहले से ही रिपॉजिटरी में जोड़ी जा चुकी थी, तो Git बाद में जोड़े गए इग्नोर नियम की परवाह किए बिना उसमें होने वाले परिवर्तनों को ट्रैक करना जारी रखता है। नियम सही हो सकता है और फिर भी तब तक निष्प्रभावी लग सकता है जब तक कि आप उस फ़ाइल को इंडेक्स से हटा नहीं देते। (Git gitignore दस्तावेज़)
Mac पर, Terminal खोलें और रिपॉजिटरी के टॉप-लेवल फ़ोल्डर में जाएं। Apple, Terminal को macOS के कमांड-लाइन इंटरफ़ेस के रूप में दस्तावेज़ित करता है और zsh को डिफ़ॉल्ट शेल बताता है; नीचे दिए गए कमांड सामान्य zsh सेटअप में काम करते हैं। इंडेक्स में बदलाव करने से पहले पुष्टि करें कि आप सही रिपॉजिटरी में हैं:
git status
अगले कमांड में फ़ाइल पाथ रिपॉजिटरी के रूट के सापेक्ष (relative) है। उदाहरण को वास्तविक पाथ से बदलें। कोट्स (quotes) बनाए रखें: वे स्पेस और * जैसे वर्णों को शेल द्वारा इंटरप्रेट किए जाने से बचाते हैं। -- विकल्पों (options) के अंत को दर्शाता है, ताकि हाइफ़न से शुरू होने वाले पाथ को एक पाथ के रूप में ही माना जाए।
इंडेक्स से फ़ाइल हटाएं और Mac कॉपी को बनाए रखें
चलाएं:
git rm --cached -- "path/to/file"
--cached पाथ को Git के इंडेक्स से हटाता है, वर्किंग ट्री से नहीं। फ़ाइल आपके Mac पर बनी रहनी चाहिए। यह अगले कमिट के लिए एक रिमूवल स्टेज करता है; यह फ़ाइल के पहले कमिट किए गए इतिहास को नहीं मिटाता है। (Git git rm दस्तावेज़)
यदि पाथ किसी डायरेक्टरी के अंदर है और आपका उद्देश्य पूरी डायरेक्टरी को ट्रैक करना बंद करना है, तो -r जोड़ें और उसके पाथ का उपयोग करें:
git rm --cached -r -- "path/to/directory"
इसका सावधानी से उपयोग करें: Git उस डायरेक्टरी के तहत सभी ट्रैक्ड पाथ्स को इंडेक्स से हटा देता है। स्थानीय फ़ाइलें बनी रहती हैं, लेकिन रिमूवल स्टेज हो जाता है। यदि Git मना करता है क्योंकि फ़ाइल में स्टेड परिवर्तन हैं या इसकी सामग्री नवीनतम कमिट के संस्करण से भिन्न है, तो रुकें और git status की जांच करें; जब तक आप यह न समझ लें कि कौन से स्टेड परिवर्तन डिस्कार्ड हो जाएंगे, -f न जोड़ें। Git ऐसे परिवर्तनों के लिए अपने सामान्य सुरक्षा तंत्र के ओवरराइड के रूप में फ़ोर्स को दस्तावेज़ित करता है। (Git git rm दस्तावेज़)
इग्नोर नियम की जांच करें और समीक्षा करें कि क्या कमिट किया जाएगा
सुनिश्चित करें कि .gitignore पैटर्न उस इग्नोर फ़ाइल के स्थान से पाथ से मेल खाता है। उदाहरण के लिए, रिपॉजिटरी-रूट के .gitignore में मौजूद एक नियम जिसमें local-settings.json शामिल है, किसी भी डायरेक्टरी स्तर पर उस नाम की फ़ाइलों से मेल खाता है; /local-settings.json इस मिलान को केवल रिपॉजिटरी रूट तक सीमित करता है। Git पैटर्न .gitignore वाली डायरेक्टरी के सापेक्ष होते हैं, और अधिक विशिष्ट निचले स्तर की इग्नोर फ़ाइलें परिणाम को प्रभावित कर सकती हैं। (Git gitignore दस्तावेज़)
Git से पूछें कि अब-अनट्रैक्ड फ़ाइल से कौन सा नियम मेल खाता है:
git check-ignore -v -- "path/to/file"
-v विकल्प इसके लिए ज़िम्मेदार सोर्स और पैटर्न को दिखाता है। यदि यह कुछ भी प्रिंट नहीं करता है, तो स्पेलिंग, पाथ और पैटर्न के स्थान की दोबारा जांच करें। Git का FAQ पहले से ट्रैक की गई फ़ाइल को अनट्रैक और इग्नोर करने के लिए git rm --cached के साथ-साथ एक मैचिंग इग्नोर पैटर्न की अनुशंसा करता है। (Git FAQ)
कमिट करने से पहले स्टेड परिवर्तन और वर्किंग कॉपी की समीक्षा करें:
git status
स्टेटस में पाथ को डिलीट किए गए के रूप में स्टेज किया हुआ दिखना चाहिए और .gitignore को मॉडिफ़ाइड दिखना चाहिए यदि उसका परिवर्तन पहले से स्टेज नहीं है। वर्किंग फ़ाइल अभी भी मौजूद होनी चाहिए। यदि आवश्यक हो तो इग्नोर फ़ाइल को स्टेज करें, फिर दोनों परिवर्तनों को कमिट करें:
git add -- .gitignore
git commit -m "Stop tracking local file"
यदि प्रासंगिक इग्नोर फ़ाइल किसी सब-डायरेक्टरी में है, तो git add में इसके रिपॉजिटरी-रिलेटिव पाथ का उपयोग करें। कमिट करने से पहले git status की दोबारा समीक्षा करें, विशेष रूप से यदि अन्य कार्य भी स्टेज किए गए हैं, ताकि कमिट में केवल वही परिवर्तन शामिल हों जो आप चाहते हैं।
कमिट के बाद क्या होता है
कमिट के बाद, Git वर्तमान ब्रांच में उस पाथ को ट्रैक नहीं करता है, और इग्नोर नियम इसे गलती से फिर से जोड़े जाने से रोकता है। कमिट एक रिमूवल रिकॉर्ड करता है, इसलिए जो सहयोगी उस कमिट को चेक आउट करेंगे, वे अपने वर्किंग ट्री से ट्रैक्ड फ़ाइल को हटा हुआ पाएंगे; प्रत्येक व्यक्ति की स्थानीय इग्नोर की गई कॉपी Git द्वारा स्वचालित रूप से संरक्षित नहीं की जाती है। यदि फ़ाइल में ऐसा शेयर्ड कॉन्फ़िगरेशन शामिल है जिसकी टीम के साथियों को अभी भी आवश्यकता है, तो कमिट करने से पहले समन्वय करें। पहले कमिट किए गए संस्करण रिपॉजिटरी के इतिहास में बने रहते हैं, इसलिए यह प्रक्रिया पिछली कॉपियों को नहीं हटाती है। (Git git rm दस्तावेज़)
यदि आपका इरादा फ़ाइल को सभी के लिए ट्रैक रखते हुए केवल स्थानीय संपादनों को छिपाने का था, तो .gitignore सही तंत्र नहीं है। Git उस उद्देश्य के लिए assume-unchanged या skip-worktree का उपयोग करने के विरुद्ध सलाह देता है; इसके बजाय एक ट्रैक्ड टेम्प्लेट और एक अलग इग्नोर की गई स्थानीय कॉन्फ़िगरेशन फ़ाइल पर विचार करें। (Git FAQ)
स्रोत
Git - git-rm दस्तावेज़ — Git
Git FAQ — Git
Mac पर Terminal में डिफ़ॉल्ट शेल बदलें — Apple Support