प्रश्न में दोनों उदाहरण वास्तव में बहुत खराब उदाहरण हैं जो डेटा हानि का कारण बन सकते हैं!
मेरी सलाह: /*
जब तक आपके पास एक अच्छा कारण नहीं है, तब तक .gitignore फाइलों में निर्देशिकाओं के लिए अपील न करें!
एक अच्छा कारण उदाहरण के लिए होगा जो जेफ्रोमी ने लिखा है: "यदि आप बाद में निर्देशिका में कुछ को अनदेखा करने का इरादा रखते हैं" ।
अन्यथा ऐसा नहीं किया जाना चाहिए इसका कारण यह है कि /*
निर्देशिकाओं को जोड़ना एक हाथ से काम करता है जिस तरह से यह निर्देशिका की सभी सामग्रियों को ठीक से अनदेखा करता है, लेकिन दूसरी तरफ इसका एक खतरनाक दुष्प्रभाव है:
यदि आप अपनी रिपॉजिटरी में git stash -u
(अस्थायी रूप से ट्रैक की गई और अनट्रैक की गई फ़ाइलों को स्टैश करने के लिए) git clean -df
( या अनट्रेक्ट की गई लेकिन अनदेखी की गई फाइलों को हटाने के लिए ) निष्पादित करते हैं, तो उन सभी डाइरेक्टरीज को जो एक एप्रेन /*
से नजरअंदाज की जाती हैं, अपरिवर्तनीय रूप से डिलीट हो जाएंगी !
कुछ पृष्ठभूमि
मुझे यह कठिन तरीका सीखना था। मेरी टीम का कोई व्यक्ति /*
हमारे .gitignore की कुछ निर्देशिकाओं से जुड़ रहा था। समय के साथ मेरे पास ऐसे अवसर थे जहां कुछ निर्देशिकाएं अचानक गायब हो जाएंगी। हमारे आवेदन के लिए आवश्यक स्थानीय डेटा के गीगाबाइट के साथ निर्देशिकाएँ। कोई भी इसे समझा नहीं सकता था और मुझे हमेशा सभी डेटा को फिर से डाउनलोड करने से नफरत है। थोड़ी देर के बाद मुझे एक धारणा मिली कि इसे करना पड़ सकता है git stash
। एक दिन मैं अपने स्थानीय रेपो को साफ करना चाहता था (फाइलों को अनदेखा करते हुए) और मैं उपयोग कर रहा था git clean -df
और फिर से मेरा डेटा चला गया था। इस बार मैंने इस मुद्दे पर पर्याप्त जांच की। मैंने आखिरकार समझ लिया कि इसका कारण है /*
।
मुझे लगता है कि यह किसी भी तरह से इस तथ्य से समझाया जा सकता है कि directory/*
निर्देशिका की सभी सामग्रियों को अनदेखा करता है, लेकिन निर्देशिका को ही नहीं। इस प्रकार यह न तो ट्रैक किया जाता है और न ही अनदेखा किया जाता है जब चीजें हटा दी जाती हैं। भले ही git status
और git status --ignored
उस पर थोड़ा अलग चित्र दें।
प्रजनन कैसे करें?
यहां बताया गया है कि व्यवहार को कैसे पुन: पेश किया जाए। मैं वर्तमान में Git 2.8.4 का उपयोग कर रहा हूं।
localdata/
इसमें एक डमी फ़ाइल के साथ एक निर्देशिका ( important.dat
) एक स्थानीय गिट रिपॉजिटरी में बनाई जाएगी और सामग्री को फ़ाइल /localdata/*
में डालकर अनदेखा किया जाएगा .gitignore
। जब दो उल्लिखित गिट कमांडों में से एक को अब निष्पादित किया जाता है, तो निर्देशिका (अप्रत्याशित रूप से) खो जाएगी।
mkdir test
cd test
git init
echo "/localdata/*" >.gitignore
git add .gitignore
git commit -m "Add .gitignore."
mkdir localdata
echo "Important data" >localdata/important.dat
touch untracked-file
यदि आप git status --ignored
यहां करते हैं, तो आपको मिलेगा:
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
untracked-file
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
localdata/
अब या तो करो
git stash -u
git stash pop
या
git clean -df
दोनों मामलों में कथित रूप से नजरअंदाज की गई निर्देशिका localdata
को हटा दिया जाएगा!
यकीन नहीं होता कि क्या इसे बग माना जा सकता है, लेकिन मुझे लगता है कि यह कम से कम एक ऐसी विशेषता है जिसकी किसी को जरूरत नहीं है।
मैं रिपोर्ट करता हूँ कि git विकास सूची में और देखें कि वे इसके बारे में क्या सोचते हैं।
.gitignore
फ़ाइलों और निर्देशिकाओं के बीच अंतर करता है जिसे वह अनदेखा करता है? उदाहरण के लिए,data
बनामdata/
अलग-अलग चीजों का मतलब है?