फ़ाइलों को अनदेखा करने (लेकिन हटाने के लिए नहीं) के लिए gitignore का उपयोग करना


98

मेरे पास मेरे git रेपो में एक tmp निर्देशिका है जो मैं अभी भी मौजूद रहना चाहूंगा, लेकिन इसे अनदेखा किया जाएगा। मैंने इसे जोड़ा .gitignore, लेकिन फिर git statusभी मुझे उस निर्देशिका में फ़ाइलों के परिवर्तन के बारे में बताता है। मैंने कोशिश की git rm -r --cached, लेकिन वह इसे रिमोट रेपो से हटा देता है। मैं इस निर्देशिका में होने वाले परिवर्तनों को कैसे रोक सकता हूं, लेकिन फिर भी इसे मौजूद होने की अनुमति है? मैं भी 1 फ़ाइल के लिए ऐसा करने की जरूरत है, लेकिन उस में परिवर्तन के git statusबाद भी .gitignoreउन्हें दिखाने के लिए। मुझे क्या करना चाहिए?


1
कृपया लिख ​​दें कि आपकी .gitignore फ़ाइल वास्तव में कैसी दिखती है?
khahairy

जवाबों:


183

इसके बजाय .gitignore, आप निम्नलिखित आदेश चलाकर स्थानीय गिट रिपॉजिटरी को अपडेट कर सकते हैं:

git update-index --assume-unchanged <file>

इस मामले में एक फाइल को मूल रेपो में ट्रैक किया जा रहा है। आप इसे अपने स्थानीय रेपो में संशोधित कर सकते हैं और गिट इसे कभी भी चिह्नित नहीं करेंगे। पर और अधिक पढ़ें:


22
मेरे प्यार का मजा शायद दोगुना हो गया।
मार्क फॉक्स

2
यह स्वीकृत उत्तर होना चाहिए। उस से जोड़ने के लिए धन्यवाद।
गौमीम

4
क्या इसे दूरस्थ रेपो में धकेलने का कोई तरीका है?
ब्रायन ऑर्टिज़

2
हम्म मैं एक फ़ाइल को "यह एक git फ़ाइल नहीं है, कभी भी इसे git के साथ सिंक नहीं करेगा, यहाँ तक कि किसी अन्य रेपो में भी नहीं"
कल्पनाशील

11
आप इसके साथ वापस लौट सकते हैं git update-index --no-assume-unchanged <file>। यदि आप उन्हें सूचीबद्ध करना चाहते हैं git ls-files -v | grep '^h'
संगीहुन ली

12

फाइलों में किए गए परिवर्तनों को नजरअंदाज करते हुए उन्हें मौजूद रहने की अनुमति देना सटीक उद्देश्य है .gitignore। इसलिए फ़ाइलों (या निर्देशिकाओं) को जोड़ना .gitignoreकेवल एक चीज है जो आपको करना है।

लेकिन आपकी समस्या यह है कि git पहले से ही उन फाइलों पर नज़र रखता है जिन्हें आप अनदेखा करना चाहते हैं और .gitignoreट्रैक की गई फ़ाइलों पर लागू नहीं होते हैं। इस ट्रैकिंग को रोकने का एकमात्र तरीका उन्हें हटाने के लिए गिट बताना है। उपयोग करके git rm --cached, आप अपनी स्थानीय फ़ाइलों को हटाने से गिट को रोकते हैं, लेकिन आपके परिवर्तनों को प्राप्त करने वाले किसी भी अन्य रिपॉजिटरी को हटाने को लागू किया जाएगा। मुझे नहीं लगता कि आपके खुद के भंडार से बचने का कोई तरीका है। आपको अन्य रिपॉजिटरी पर कुछ करना होगा, या स्वीकार करें कि फाइलें हटा दी जाएंगी।

आप कर सकते हैं एक दूसरे के भंडार पर हटाने को रोकने के लिए:

  • (स्पष्ट रूप से) फ़ाइलों को कहीं बैकअप दें, परिवर्तनों को खींचें और फ़ाइलों को पुनर्स्थापित करें,
  • या आपके परिवर्तनों को खींचने से पहलेgit rm --cached फाइलें और प्रतिबद्ध भी । Git पहले से ही बिना पड़ी फ़ाइलों को छूने के बिना दो निष्कासनों का विलय करेगा।

6
यह सच नहीं है ("फ़ाइल को ट्रैक करना = फ़ाइल को रोकना")। आप अभी भी एक रेपो में ट्रैक की गई फ़ाइल का उपयोग कर सकते हैं और कोई भी परिवर्तन नहीं देख सकते हैं git update-index --assume-unchanged <file>:। इस पर एक नज़र: blog.pagebakers.nl/2009/01/29/…
ducin

इसने मेरी समस्या हल कर दी क्योंकि मुझे git में धकेल दी गई रिपॉजिटरी से फाइल हटाने की जरूरत है git rm --cached <filename> -r और इस पुश के बाद रिपॉजिटरी में फिर से बदलाव होता है इसलिए फाइल को हटा दिया जाता है
Vinicius Cardoso

7

एक रखो /अपने में निर्देशिका नाम के अंत में .gitignoreफ़ाइल, यानी

tmp/

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

git rm -rf ./tmp/
git commit -m "untrack tmp dir"
mkdir tmp
echo tmp/ >> .gitignore
git add .gitignore ; git commit -m "add tmp/ to ignore list"

उस निर्देशिका की नई फ़ाइलों को ट्रैक नहीं किया जाएगा।

केवल सूचकांक पर काम --cachedकरने का विकल्प git rm(लंबित परिवर्तन कम या ज्यादा)। यह काम करने वाले पेड़ या ट्रैक किए गए या नहीं की स्थिति पर कोई प्रभाव नहीं है।


वह मेरे पास है। दोनों the/dir/औरthe/dir/*
21312312

हे मैट, अगर मेरे पास अलग-अलग फ़ोल्डरों में कुछ ऐसा है / मीडिया जिसे मैं अनदेखा करना चाहूंगा, क्या यह संभव है? तो जैसे / 1 / मीडिया, / 2 / मीडिया, सभी को 99 पसंद है?
निक

3

.ignignore का ट्रैक की गई फ़ाइलों पर कोई प्रभाव नहीं पड़ता है।

आप जो चाहते हैं, वह tmp / निर्देशिका में फ़ाइलों पर मान-अपरिवर्तित बिट सेट करना है। वहाँ एक अच्छा विवरण है कि यहाँ करने के लिए बताया गया है: Git: केवल स्थानीय रेपो में untrack एक फ़ाइल और दूरदराज के रेपो में रखने

इसके अलावा, की स्थापना के लिए एक-लाइनर्स मान-अपरिवर्तित एक निर्देशिका में सभी फाइलों पर - Git अद्यतन सूचकांक निर्देशिका पर --assume-अपरिवर्तित


1

ऐसा लगता है कि आप किसी फ़ाइल (जैसे index.php) को ट्रैक करने की कोशिश कर रहे हैं , इसे दूरस्थ रिपॉजिटरी में जोड़ें, फिर इसे देखना बंद कर दें, जबकि फ़ाइल को रिमोट में रखें (यानी index.phpस्थानीय रूप से इसे बदलते समय रिमोट रेपो पर अपरिवर्तित रखें )।

मैं जो समझता हूं, वह ऐसा नहीं कर सकता। आप या तो किसी फ़ाइल को ट्रैक कर सकते हैं, या नहीं। यदि आप किसी फ़ाइल को ट्रैक करते हैं, तो यह दूरस्थ रेपो में मौजूद है, और जब आप इसमें बदलाव करते हैं तो यह बदल जाता है। यदि आप किसी फ़ाइल को ट्रैक नहीं करते हैं, तो वह दूरस्थ रेपो में मौजूद नहीं है।

चूँकि यह बिल्कुल संभव नहीं है कि आप गिट के साथ क्या चाहते हैं, आपकी सटीक स्थिति के आधार पर, संभावित रूप से अन्य समाधान भी हैं। उदाहरण के लिए, index.phpजब आप इसे स्थानीय रूप से बदलते हैं तो आप रिमोट पर क्यों नहीं बदलना चाहते हैं ? क्या फ़ाइल में उपयोगकर्ता-विशिष्ट सेटिंग्स हैं? यदि यह मामला है, तो आप यह कर सकते हैं:

cp index.php index_template.php
git rm --cached index.php

अब index_template.php को संपादित करें जैसा कि आप चाहते हैं कि यह रिमोट रेपो पर दिखाई दे। अपने भंडार का उपयोग करने वाले लोगों को यह बताने के लिए अपने README में कुछ जोड़ें कि एक बार जब वे इसे क्लोन कर लेते हैं, तो उन्हें index.phemplate.php को index.php पर कॉपी करना होगा और अपनी आवश्यकताओं के अनुरूप इसे संपादित करना होगा।

git add index_template.php
git add README
git commit -m 'added template index.php file'
git push

जब कोई आपके रेपो को क्लोन करता है, तो उन्हें अपना खुद का बनाना होगा index.php। आप उनके लिए आसान है यह कर दिया है: बस कॉपी index_template.phpकरने के लिए index.phpऔर कंप्यूटर से विशिष्ट सेटिंग्स के साथ इस पर संशोधन।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.