मुझे नहीं लगता कि एक Git कमिट "इस फाइल को ट्रैक करना बंद कर सकता है, लेकिन इसे डिलीट नहीं करता" जैसे इरादे को रिकॉर्ड कर सकता है।
इस तरह के इरादे को लागू करने के लिए किसी भी रिपॉजिटरी में Git के बाहर हस्तक्षेप की आवश्यकता होगी जो फ़ाइल को हटाने वाली एक कमेटी को मर्ज (या रीबेस) करता है।
एक प्रतिलिपि सहेजें, हटाएं लागू करें, पुनर्स्थापित करें
संभवतः करने के लिए सबसे आसान बात यह है कि अपने डाउनस्ट्रीम उपयोगकर्ताओं को फ़ाइल की एक प्रति बचाने के लिए, अपने विलोपन को खींचने के लिए कहें, फिर फ़ाइल को पुनर्स्थापित करें। यदि वे रिबास के माध्यम से खींच रहे हैं और फ़ाइल में संशोधन कर रहे हैं, तो उन्हें संघर्ष मिलेगा। इस तरह के संघर्षों को हल करने के लिए, उपयोग करें git rm foo.conf && git rebase --continue
(यदि हटाए गए फ़ाइल के अलावा परस्पर विरोधी प्रतिबद्धता में परिवर्तन होता है) या git rebase --skip
( या यदि विरोधाभासी प्रतिबद्धता केवल हटाए गए फ़ाइल में बदल गई है)।
पुनर्स्थापना के बाद फाइल को अनटैक्ड के रूप में एक कमिट करने के बाद हटा देता है
यदि उन्होंने पहले ही आपकी विलोपन प्रतिबद्धता को खींच लिया है, तब भी वे फ़ाइल के पिछले संस्करण को गिट शो के साथ पुनर्प्राप्त कर सकते हैं :
git show @{1}:foo.conf >foo.conf
या गिट चेकआउट के साथ (विलियम पर्सेल द्वारा प्रति टिप्पणी; लेकिन याद रखें कि इसे फिर से सूचकांक से हटा दें!)।
git checkout @{1} -- foo.conf && git rm --cached foo.conf
यदि उन्होंने आपके विलोपन को खींचने के बाद से अन्य कार्रवाइयाँ की हैं (या वे रिबेट के साथ अलग किए गए HEAD में खींच रहे हैं), तो उन्हें इसके अलावा कुछ और की आवश्यकता हो सकती है @{1}
। वे git log -g
आपके विलोपन को खींचने से ठीक पहले कमिटमेंट खोजने के लिए उपयोग कर सकते हैं ।
एक टिप्पणी में, आप उल्लेख करते हैं कि जिस फ़ाइल को आप "अनट्रैक करना चाहते हैं, लेकिन रखें" कुछ प्रकार की कॉन्फ़िगरेशन फ़ाइल है जो सॉफ़्टवेयर चलाने के लिए आवश्यक है (सीधे एक भंडार से बाहर)।
फ़ाइल को 'डिफ़ॉल्ट' और मैन्युअल रूप से स्वचालित रूप से सक्रिय रखें
यदि यह रिपॉजिटरी में कॉन्फ़िगरेशन फ़ाइल की सामग्री को बनाए रखने के लिए जारी रखने के लिए पूरी तरह से अस्वीकार्य नहीं है, तो आप ट्रैक किए गए फ़ाइल को (जैसे) foo.conf
से foo.conf.default
फिर से नाम बदलने में सक्षम हो सकते हैं और फिर अपने उपयोगकर्ताओं को cp foo.conf.default foo.conf
नाम बदलने के लिए प्रतिबद्ध करने के बाद निर्देश दे सकते हैं। या, यदि उपयोगकर्ता पहले से ही रिपॉजिटरी के कुछ मौजूदा हिस्से का उपयोग करते हैं (जैसे एक स्क्रिप्ट या कुछ अन्य प्रोग्राम जो रिपॉजिटरी में सामग्री द्वारा कॉन्फ़िगर किया गया है (जैसे Makefile
या समान)) आपके सॉफ़्टवेयर को लॉन्च / तैनात करने के लिए, आप लॉन्च में एक डिफ़ॉल्ट तंत्र को शामिल कर सकते हैं / तैनाती प्रक्रिया:
test -f foo.conf || test -f foo.conf.default &&
cp foo.conf.default foo.conf
इस तरह के एक डिफ़ॉल्ट तंत्र के साथ, उपयोगकर्ताओं को किसी भी अतिरिक्त कार्य को foo.conf
करने के foo.conf.default
बिना एक नाम बदलने में सक्षम होना चाहिए । साथ ही, यदि आप भविष्य में अतिरिक्त इंस्टॉलेशन / रिपॉजिटरी बनाते हैं, तो आप मैन्युअल रूप से एक कॉन्फ़िगरेशन फ़ाइल की प्रतिलिपि बनाने से बचें।
इतिहास को फिर से लिखने के लिए मैन्युअल हस्तक्षेप की आवश्यकता होती है ...
यदि यह भंडार में सामग्री को बनाए रखने के लिए अस्वीकार्य है तो आप संभवतः इसे इतिहास से पूरी तरह से मिटाना चाहेंगे git filter-branch --index-filter …
। यह इतिहास को फिर से लिखने के लिए है, जिसके लिए प्रत्येक शाखा / भंडार के लिए मैनुअल हस्तक्षेप की आवश्यकता होगी (देखें "अपस्ट्रीम रिबेस से पुनर्प्राप्त करना" अनुभाग में git rebase manpage )। आपकी कॉन्फ़िगरेशन फ़ाइल के लिए आवश्यक विशेष उपचार सिर्फ एक और कदम होगा जिसे किसी को फिर से लिखने के दौरान ठीक करना होगा:
- कॉन्फ़िगरेशन फ़ाइल की एक प्रति सहेजें।
- फिर से लिखना से पुनर्प्राप्त करें।
- कॉन्फ़िगरेशन फ़ाइल को पुनर्स्थापित करें।
पुनरावृत्ति को रोकने के लिए इसे अनदेखा करें
आप जिस भी तरीके का उपयोग करते हैं, आप शायद कॉन्फ़िगरेशन फ़ाइल नाम .gitignore
को रिपॉजिटरी में एक फ़ाइल में शामिल करना चाहेंगे ताकि कोई भी अनजाने में git add foo.conf
फिर से न हो सके (यह संभव है, लेकिन -f
/ की आवश्यकता है --force
)। यदि आपके पास एक से अधिक कॉन्फ़िगरेशन फ़ाइल है, तो आप उन सभी को एक ही निर्देशिका में 'ले जाने' पर विचार कर सकते हैं और पूरी चीज़ को अनदेखा कर सकते हैं ('मूविंग' से मेरा मतलब है कि परिवर्तन जहां प्रोग्राम अपनी कॉन्फ़िगरेशन फ़ाइलों को खोजने की उम्मीद करता है, और उपयोगकर्ता प्राप्त कर रहा है (या) लॉन्च / तैनाती तंत्र) फ़ाइलों को उनके नए स्थान पर कॉपी / स्थानांतरित करने के लिए; आप स्पष्ट रूप से एक फ़ाइल को एक निर्देशिका में बदलना नहीं चाहेंगे जिसे आप अनदेखा कर रहे हैं)।