पहले से ही चेक-इन निर्देशिका की सामग्री की उपेक्षा?


227

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

अब मैं केवल (स्रोत) पदानुक्रमित फ़ाइल संरचना को गिट द्वारा ट्रैक करना चाहता हूं, और (लक्ष्य) फ्लैट निर्देशिका (एक ढेर में सभी फाइलों के साथ) को अनदेखा किया जाना चाहिए।

मैंने। निर्देशिका को लक्ष्य निर्देशिका में जोड़ा है, लेकिन गिट अभी भी इसमें बदलावों पर नज़र रख रहा है। मैंने सोचा था कि अगर मैं लक्ष्य निर्देशिका में पुरानी फ़ाइल को हटाने के लिए प्रतिबद्ध हूं, तो शायद नई सामग्री (स्क्रिप्ट द्वारा कॉपी की गई) पर नज़र रखना बंद हो जाए, लेकिन ऐसा नहीं है।

मैं लक्ष्य निर्देशिका के बारे में कैसे भूल सकता हूँ?


निर्देशिका का नाम क्या है और आपने क्या काम किया है। 16ign पर 16 मिमी
mmignmm

1
नाम DirNameIrrelevant और in .ignignore है जिसे मैंने "DirNameIrrelevant", "DirNameIrrelevant /" और "DirNameIrrelevant / *" "
Felixyz

जवाबों:


524

यह आदेश वास्तव में उन्हें हटाने के बिना आपकी निर्देशिका और इसके तहत सभी फ़ाइलों को अनट्रैक करने का कारण होगा:

git rm -r --cached <your directory>

-rविकल्प आपके निर्देशिका के अंतर्गत सभी फ़ाइलों को हटाने का कारण बनता है।

--cachedविकल्प केवल Git के सूचकांक, नहीं अपने काम की नकल से हटाया जा करने के लिए फ़ाइलों का कारण बनता है। डिफ़ॉल्ट रूप git rm <file>से हटा देगा <file>


आह, धन्यवाद। बहुत उपयोगी है, हालांकि मैं यह नहीं देखता कि यह क्यों आवश्यक होना चाहिए (क्यों इसे (.ignignore) में dir जोड़ना पर्याप्त नहीं है)। क्या आप मुझे बता सकते हैं - कैशेड किसके लिए है?
फेलिक्सज़

ज़रूर। मैंने दो विकल्पों का वर्णन करने के लिए अपने उत्तर में संशोधन किया है।
गॉर्डन विल्सन

यह आवश्यक क्यों है, इसके लिए मैं केवल अटकलें लगा सकता हूं। मुझे लगता है कि निर्माता चाहते थे कि आपकी परियोजना के महत्वपूर्ण हिस्सों को गलत तरीके से अनट्रैक करने के जोखिमों को कम करने के लिए फाइलों का अनट्रैकिंग स्पष्ट हो। मुझे लगता है कि इसके तकनीकी कारण भी हैं।
गॉर्डन विल्सन

15
Gitignore का उपयोग यह निर्धारित करने के लिए किया जाता है कि अनटाइटेड फाइल्स git के बारे में क्या पता होगा; पहले से ट्रैक की जा रही फाइलों पर इसका कोई असर नहीं है। यदि उपयोगकर्ता अन्यथा अनदेखा की गई फ़ाइलों को ट्रैक करना चाहता है, तो git उन्हें अनुमति देता है। यह या तो उपयोग किया जा सकता है add -fया आपकी स्थिति हो सकती है। जैसा कि गॉर्डन ने कहा, यह आपको गलती से फ़ाइलों का एक गुच्छा मिटा देता है - रिपॉजिटरी मास्टर सूची है, न कि गिटिगन। यह आपको मैन्युअल रूप से कुछ चीजों को ट्रैक करने देता है जिन्हें अन्यथा वाइल्डकार्ड नियम द्वारा अनदेखा किया जाएगा, कुछ ऐसा जो मैंने उपयोगी पाया है।
कैस्केबेल

-rविकल्प "अपनी निर्देशिका के अंतर्गत सभी फ़ाइलों को हटाने का कारण बनता है" के लिए नहीं है बल्कि उपनिर्देशिका के माध्यम से recurse करने।
21

78

यदि आपको एक ट्रैक की गई फ़ाइल (चेक इन) की आवश्यकता है, लेकिन इसे अपने स्थानीय रिपॉजिटरी के साथ-साथ रिमोट रिपॉजिटरी में रखते हुए किसी फ़ाइल के और परिवर्तनों को ट्रैक नहीं करना चाहते हैं, तो इसके साथ किया जा सकता है:

git update-index --assume-unchanged path/to/file.txt

उसके बाद इस फ़ाइल में कोई भी परिवर्तन अब दिखाई नहीं देगा git status


1
जबकि ओपी ने एक निर्देशिका के लिए कहा हो सकता है, यह वही है जो मैं देख रहा था - फ़ाइल में एकल चेक किए गए परिवर्तनों को अनदेखा करना; धन्यवाद!
सादाऊ

1
एक निर्देशिका को अनदेखा करने के लिए पूरी तरह से 'git update-index -assume-अपरिवर्तित dirName / *' का उपयोग करें। मुझे वाक्य-विन्यास खोजने में थोड़ी देर लगी, यहाँ '*' की जरूरत है
J-Dizzle

1
कोई इसका उल्टा कैसे करेगा?
Rhys

3
@ इसे रिवर्स करने के लिए:git update-index --no-assume-unchanged dirname/**/*
JobJob

3

एक उपनिर्देशिका जिसे blah/git में जोड़ा गया है, के लिए निम्नलिखित दोनों नई फ़ाइलों को अनदेखा करने के लिए काम करते हैं blah/। जोड़ा गया .gitignore:

blah 
blah/*

1

टीएल; डीआर आपके गिट रिपॉजिटरी को साफ करने और यह सुनिश्चित करने के लिए कि आपके सभी उपेक्षित आइटम वास्तव में नजरअंदाज किए जाते हैं:

git rm -r --cached .
git add .
git commit -m "Clean up ignored files"

नोट: आपको एक निर्देशिका निर्दिष्ट करने की आवश्यकता नहीं है, इस तरह से आपके पूरे दूरस्थ रेपो की सफाई हो रही है ।

आगे पढ़ने के लिए इसे पढ़ें


0

यकीन नहीं होता कि यह मुझे एक बुरा व्यक्ति बताता है या बनाता है, लेकिन यहाँ यह जाता है।

  1. मैंने *Generated*रूट .gitignore फ़ाइल में जोड़ा
  2. मैंने उन फ़ाइलों को प्रस्तुत किया जिन्हें मैं GeneratedFile.Whatever.ext के रूप में रखना चाहता हूं। आगमन की सूचना दिया
  3. मैंने पोस्ट चेकआउट पर एक git हुक बनाया जो इसे करने वाली एक पॉवरशेल स्क्रिप्ट को कॉल करने के लिए:

dir *.CheckedIn -Recurse | %{ copy $_.FullName "$($_.FullName)".Replace("CheckedIn","") -EA SilentlyContinue}

मुझे अपने बारे में थोड़ा बुरा लगता है ... लेकिन यह वास्तव में काम करता है।


-2

ठीक है, ऐसा लगता है कि आपको पहले पूरी तरह से खाली (न तो पुरानी और न ही नई फाइलें) निर्देशिका के साथ एक चेक-इन करना होगा, और उसके बाद जोड़ी गई किसी भी फाइल को नजरअंदाज कर दिया जाएगा। यदि आप पुरानी फ़ाइलों को जोड़ने और नए लोगों को कमिट करने से पहले हटाते हैं, तो नए को रेपो में जोड़ दिया जाता है, हालांकि उन्हें अनदेखा किया जाना चाहिए।

कम से कम, इस स्थिति में मेरे लिए काम किया। अभी भी बहुत अच्छा होगा अगर कोई भी इस बारे में अधिक जानकारी दे सके कि क्या हो रहा है।


1
हमने जो कहीं और कहा है उसका लघु संस्करण - gitignore प्रभावित करता है कि अनटैक किए गए डेटा git के बारे में क्या पता होगा। यह प्रभावित नहीं करता है कि आपके द्वारा बताए गए डेटा के साथ क्या किया जाएगा (उदाहरण के लिए इसे भंडार में जोड़ने के लिए निर्देशित)।
कैस्केबेल

तो यह समझ में आता है कि जिन फ़ाइलों को ट्रैक किया गया था और अब हटाए गए हैं उन्हें इस तरह ट्रैक किया जाना चाहिए, लेकिन यह अभी भी मुझे समझ में नहीं आता है कि जो फाइलें जोड़ी गई हैं (यदि अगली प्रतिबद्ध से पहले की गई हैं) को ट्रैक किया जाता है, जबकि अगर मैं 1) अनदेखा करें, 2) डिलीट फाइल्स, 3) कमिट, 4) नई फाइल जोड़ें, नई फाइल्स ट्रैक नहीं होती हैं।
फेलिक्सज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.