git मैं गिट भंडार में एक खाली निर्देशिका कैसे जोड़ सकता हूं?




14 Answers

आप नहीं कर सकते गिट एफएक्यू देखें।

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

उनके अंदर फ़ाइलों को जोड़ते समय निर्देशिका स्वचालित रूप से जोड़ दी जाती है। यही है, निर्देशिका को भंडार में कभी भी जोड़ा जाना नहीं है, और स्वयं को ट्रैक नहीं किया जाता है।

आप " git add <dir> " कह सकते हैं और यह वहां फाइलें जोड़ देगा।

यदि आपको वास्तव में चेकआउट में मौजूद निर्देशिका की आवश्यकता है तो आपको इसमें एक फ़ाइल बनाना चाहिए। .gitignore इस उद्देश्य के लिए अच्छी तरह से काम करता है; आप इसे खाली छोड़ सकते हैं, या उन फ़ाइलों के नाम भर सकते हैं जिन्हें आप निर्देशिका में दिखाना चाहते हैं।

git directory git-add

मैं एक गिट भंडार में एक खाली निर्देशिका (जिसमें कोई फाइल नहीं है) कैसे जोड़ सकता हूं?




आप निर्देशिका में एक रीडमे फ़ाइल हमेशा एक स्पष्टीकरण के साथ डाल सकते हैं कि आप इसे क्यों चाहते हैं, अन्यथा खाली, रिपोजिटरी में निर्देशिका।




हमें खाली संस्करण वाले फ़ोल्डरों की आवश्यकता क्यों होगी

पहली चीजें पहले:

एक खाली निर्देशिका गिट संस्करण प्रणाली के तहत एक पेड़ का हिस्सा नहीं हो सकता है

यह बस ट्रैक नहीं किया जाएगा। लेकिन ऐसे परिदृश्य हैं जिनमें "संस्करण" खाली निर्देशिका उपयोगी हो सकती है, उदाहरण के लिए:

  • एक पूर्वनिर्धारित फ़ोल्डर संरचना मचान, और इस संरचना को भंडार के प्रत्येक उपयोगकर्ता / योगदानकर्ता के लिए उपलब्ध कराएं; या, उपर्युक्त के एक विशेष मामले के रूप में , अस्थायी फ़ाइलों के लिए एक फ़ोल्डर बनाते हैं, जैसे cache/ या logs/ निर्देशिका, जहां हम फ़ोल्डर प्रदान करना चाहते हैं, लेकिन इसकी सामग्री को .gitignore
  • घबराहट से संबंधित, कुछ परियोजनाएं कुछ फ़ोल्डर्स के बिना काम नहीं करतीं (जो प्रायः खराब डिजाइन किए गए प्रोजेक्ट का संकेत देती है, लेकिन यह अक्सर वास्तविक दुनिया का परिदृश्य है और शायद कह सकता है, अनुमति समस्याएं हो सकती हैं)।

कुछ सुझाए गए कामकाज

कई उपयोगकर्ता सुझाव देते हैं:

  1. निर्देशिका को खाली करने के लिए, या कुछ सामग्री के साथ एक README फ़ाइल या किसी अन्य फ़ाइल को रखना, या
  2. एक .gitignore फ़ाइल को "रिवर्स लॉजिक" (यानी सभी फाइलों को शामिल करने के लिए) के साथ बनाना, अंत में, दृष्टिकोण # 1 के समान उद्देश्य को पूरा करता है।

जबकि दोनों समाधान निश्चित रूप से काम करते हैं, मैं उन्हें गिट संस्करण के सार्थक दृष्टिकोण के साथ असंगत पाते हैं।

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

गिटकीप दृष्टिकोण

वर्जनिंग सिस्टम में फ़ोल्डर की उपस्थिति को बल देने के लिए .gitkeep नामक एक खाली फ़ाइल का उपयोग करें।

हालांकि ऐसा कोई बड़ा अंतर नहीं लग सकता है:

  • आप उस फ़ाइल का उपयोग करते हैं जिसमें फ़ोल्डर को रखने का एकमात्र उद्देश्य है। आप वहां कोई ऐसी जानकारी नहीं डालते जिसे आप नहीं रखना चाहते हैं।

    उदाहरण के लिए, आपको उपयोगी जानकारी के साथ READMEs का उपयोग करना चाहिए, फ़ोल्डर को रखने का बहाना नहीं।

    चिंताओं का पृथक्करण हमेशा एक अच्छी बात है, और आप अभी भी अवांछित फ़ाइलों को अनदेखा करने के लिए एक .gitignore जोड़ सकते हैं।

  • इसका नामकरण। .gitkeep इसे फ़ाइल नाम से ही स्पष्ट और सीधा बनाता है (और अन्य डेवलपर्स के लिए भी, जो एक साझा परियोजना के लिए अच्छा है और गिट भंडार के मुख्य उद्देश्यों में से एक है) कि यह फ़ाइल है

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

दत्तक ग्रहण

मैंने .gitkeep , .gitkeep Angular-CLI जैसे बहुत महत्वपूर्ण ढांचे द्वारा अपनाई गई। .gitkeep दृष्टिकोण को देखा है।




एंडी लेस्टर सही है, लेकिन अगर आपकी निर्देशिका को खाली होने की जरूरत है, और खाली खाली नहीं है, तो आप वहां एक खाली .gitignore फ़ाइल को वर्कअराउंड के रूप में रख सकते हैं।

एक तरफ के रूप में, यह एक कार्यान्वयन मुद्दा है, न कि मौलिक गिट स्टोरेज डिजाइन समस्या। जैसा कि गिट मेलिंग सूची पर कई बार उल्लेख किया गया है, इसका कारण यह नहीं लगाया गया है कि किसी ने भी इसके लिए पैच जमा करने के लिए पर्याप्त देखभाल नहीं की है, न कि यह किया जा सकता है या नहीं किया जाना चाहिए।




गिट खाली निर्देशिकाओं को ट्रैक नहीं करता है। अधिक स्पष्टीकरण के लिए गिट एफएक्यू देखें। सुझाया गया कामकाज खाली निर्देशिका में एक .gitignore फ़ाइल डालना है। मुझे वह समाधान पसंद नहीं है, क्योंकि .gitignore कन्वेंशन द्वारा .gitignore "छुपा" है। इसके अलावा कोई स्पष्टीकरण नहीं है कि निर्देशिका खाली क्यों हैं।

मैं खाली निर्देशिका में एक README फ़ाइल डालने का सुझाव देता हूं कि यह बता रहा है कि निर्देशिका खाली क्यों है और इसे गिट में क्यों ट्रैक किया जाना चाहिए। रीडमे फ़ाइल के साथ, जहां तक ​​गिट का संबंध है, निर्देशिका अब खाली नहीं है।

असली सवाल यह है कि आपको गिट में खाली निर्देशिका क्यों चाहिए? आमतौर पर आपके पास कुछ प्रकार की बिल्ड स्क्रिप्ट होती है जो संकलन / चलने से पहले खाली निर्देशिका बना सकती है। यदि नहीं तो एक बनाओ। गिट में खाली निर्देशिका डालने से यह एक बेहतर समाधान है।

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

प्रत्येक खाली निर्देशिका को सूचीबद्ध करने के लिए निम्न आदेश का उपयोग करें:

find -name .git -prune -o -type d -empty -print

प्रत्येक खाली निर्देशिका में प्लेसहोल्डर READMEs बनाने के लिए:

find -name .git -prune -o -type d -empty -exec sh -c \
  "echo this directory needs to be empty because reasons > {}/README.emptydir" \;

README फ़ाइल को छोड़कर निर्देशिका में सब कुछ अनदेखा करने के लिए निम्न पंक्तियों को अपने .gitignore में डालें:

path/to/emptydir/*
!path/to/emptydir/README.emptydir
path/to/otheremptydir/*
!path/to/otheremptydir/README.emptydir

वैकल्पिक रूप से, आप केवल हर रीडमे फ़ाइल को अनदेखा होने से बाहर कर सकते हैं:

path/to/emptydir/*
path/to/otheremptydir/*
!README.emptydir

प्रत्येक README को पहले से बनाए जाने के बाद सूचीबद्ध करने के लिए:

find -name README.emptydir



हो सकता है कि एक खाली निर्देशिका जोड़ना ऐसा लगता है कि यह कम से कम प्रतिरोध का मार्ग होगा क्योंकि आपके पास ऐसी स्क्रिप्ट हैं जो निर्देशिका की मौजूदगी की अपेक्षा करते हैं (शायद क्योंकि यह उत्पन्न बाइनरी के लिए एक लक्ष्य है)। आवश्यकतानुसार निर्देशिका बनाने के लिए आपकी स्क्रिप्ट को संशोधित करना एक और तरीका होगा।

mkdir --parents .generated/bin ## create a folder for storing generated binaries
mv myprogram1 myprogram2 .generated/bin ## populate the directory as needed

इस उदाहरण में, आप निर्देशिका के लिए एक (टूटा) प्रतीकात्मक लिंक देख सकते हैं ताकि आप इसे "। जेनरेटेड" उपसर्ग के बिना एक्सेस कर सकें (लेकिन यह वैकल्पिक है)।

ln -sf .generated/bin bin
git add bin

जब आप अपना स्रोत पेड़ साफ़ करना चाहते हैं तो आप बस:

rm -rf .generated ## this should be in a "clean" script or in a makefile

यदि आप लगभग खाली फ़ोल्डर में जांच करने के लिए सुझाए गए दृष्टिकोण को लेते हैं, तो आपके पास ".gitignore" फ़ाइल को हटाए बिना सामग्री को हटाने की मामूली जटिलता है।

आप अपनी जड़ में निम्नलिखित जोड़कर अपनी सभी जेनरेट की गई फ़ाइलों को अनदेखा कर सकते हैं .gitignore:

.generated



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

यही कारण है कि मैंने एक ओपन सोर्स टूल लिखने का फैसला किया जो स्वचालित रूप से ऐसी प्लेसहोल्डर फ़ाइलों के निर्माण / हटाना का प्रबंधन कर सकता है। यह .NET प्लेटफार्म के लिए लिखा गया है और मोनो (लिनक्स के लिए .NET) और विंडोज के तहत चलता है।

बस एक नज़र डालें: http://code.google.com/p/markemptydirs




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




जेमी फ्लोरनोय का समाधान बहुत अच्छा काम करता है। यहां रखने के लिए थोड़ा उन्नत संस्करण दिया गया है .htaccess:

# Ignore everything in this directory
*
# Except this file
!.gitignore
!.htaccess

इस समाधान के साथ आप खाली फ़ोल्डर को करने में सक्षम हैं, उदाहरण के लिए /log, /tmpया /cacheफ़ोल्डर खाली रहेगा।




मैं हमेशा अपनी वांछित फ़ोल्डर संरचना की जांच करने और परियोजना के भीतर इसे मेरे लिए बनाने के लिए एक फ़ंक्शन बनाता हूं। यह इस समस्या के आसपास हो जाता है क्योंकि रिक्त फ़ोल्डर्स प्रॉक्सी द्वारा गिट में आयोजित किए जाते हैं।

function check_page_custom_folder_structure () {
    if (!is_dir(TEMPLATEPATH."/page-customs"))
        mkdir(TEMPLATEPATH."/page-customs");    
    if (!is_dir(TEMPLATEPATH."/page-customs/css"))
        mkdir(TEMPLATEPATH."/page-customs/css");
    if (!is_dir(TEMPLATEPATH."/page-customs/js"))
        mkdir(TEMPLATEPATH."/page-customs/js");
}

यह PHP में है, लेकिन मुझे यकीन है कि अधिकतर भाषाएं समान कार्यक्षमता का समर्थन करती हैं, और क्योंकि फ़ोल्डर्स के निर्माण को एप्लिकेशन द्वारा ख्याल रखा जाता है, तो फ़ोल्डर्स हमेशा वहां रहेंगे।




गिट को निर्देशिकाओं को ट्रैक करने का कोई तरीका नहीं है, इसलिए एकमात्र समाधान निर्देशिका के भीतर प्लेसहोल्डर फ़ाइल को जोड़ना है जिसे आप ट्रैक करना चाहते हैं।

फ़ाइल का नाम और कुछ भी आप चाहते हैं, लेकिन अधिकांश लोग नाम की एक खाली फ़ाइल का उपयोग कर सकते हैं .gitkeep(हालांकि कुछ लोग वीसीएस-अज्ञेयवादी पसंद करते हैं .keep)।

प्रीफिक्स्ड .इसे एक छिपी हुई फाइल के रूप में चिह्नित करता है।

एक और विचार यह READMEसमझाने के लिए एक फाइल जोड़ना होगा कि निर्देशिका का उपयोग किस प्रकार किया जाएगा।




कभी-कभी आपको बुरी लिखित पुस्तकालयों या सॉफ़्टवेयर से निपटना पड़ता है, जिसे "वास्तविक" खाली और मौजूदा निर्देशिका की आवश्यकता होती है। एक साधारण डालने .gitignoreया .keepउन्हें तोड़ने और एक बग का कारण बन सकता है। निम्नलिखित इन मामलों में मदद कर सकते हैं, लेकिन कोई गारंटी नहीं ...

पहले आवश्यक निर्देशिका बनाएं:

mkdir empty

फिर आप इस निर्देशिका के लिए एक टूटी प्रतीकात्मक लिंक जोड़ते हैं (लेकिन उपरोक्त वर्णित उपयोग मामले की तुलना में किसी अन्य मामले पर, कृपया READMEस्पष्टीकरण के साथ उपयोग करें ):

ln -s .this.directory empty/.keep

इस निर्देशिका में फ़ाइलों को अनदेखा करने के लिए, आप इसे अपनी जड़ में जोड़ सकते हैं .gitignore:

echo "/empty" >> .gitignore

अनदेखा फ़ाइल जोड़ने के लिए, इसे बल देने के लिए पैरामीटर का उपयोग करें:

git add -f empty/.keep

प्रतिबद्धता के बाद आपके सूचकांक में एक टूटा प्रतीकात्मक लिंक है और गिट निर्देशिका बनाता है। टूटी हुई लिंक में कुछ फायदे हैं, क्योंकि यह कोई नियमित फ़ाइल नहीं है और कोई नियमित फ़ाइल नहीं है। तो यह भी सवाल के हिस्से में फिट बैठता है "(जिसमें कोई फाइल नहीं है)", इरादे से नहीं बल्कि अर्थ से, मुझे लगता है:

find empty -type f

यह आदेश एक खाली परिणाम दिखाता है, क्योंकि इस निर्देशिका में कोई भी फाइल मौजूद नहीं है। इसलिए अधिकांश एप्लिकेशन, जो किसी निर्देशिका में सभी फाइलें प्राप्त करते हैं, आमतौर पर यह लिंक नहीं देखते हैं, कम से कम अगर वे "फ़ाइल मौजूद हैं" या "पठनीय" है। यहां तक ​​कि कुछ स्क्रिप्ट को कोई भी फाइल नहीं मिलेगी:

$ php -r "var_export(glob('empty/.*'));"
array (
  0 => 'empty/.',
  1 => 'empty/..',
)

लेकिन मैं दृढ़ता से केवल विशेष परिस्थितियों में इस समाधान का उपयोग करने की सलाह देता हूं, एक READMEखाली निर्देशिका में लिखा गया एक अच्छा आमतौर पर एक बेहतर समाधान होता है। (और मुझे नहीं पता कि यह विंडोज़ फाइल सिस्टम के साथ काम करता है ...)




यदि आप एक फ़ोल्डर जोड़ना चाहते हैं जो कई अर्थपूर्ण निर्देशिकाओं में बहुत अधिक क्षणिक डेटा रखेगा, तो एक दृष्टिकोण यह है कि आप इस तरह की कुछ रूट को जोड़ दें .gitignore ...

/app/data/**/*.* !/app/data/**/*.md

फिर आप *.mdप्रत्येक निर्देशिका में वर्णनात्मक README.md फ़ाइलों (या रिक्त फाइलें, इससे कोई फर्क नहीं पड़ता, जब तक कि आप उन्हें इस मामले में विशिष्ट रूप से लक्षित नहीं कर सकते ), यह सुनिश्चित करने के लिए कि निर्देशिका सभी रिपो का हिस्सा बने रहें लेकिन फ़ाइलों (एक्सटेंशन के साथ) अनदेखा रखा जाता है। सीमा: .निर्देशिका नामों में अनुमति नहीं है!

आप इन सभी निर्देशिकाओं को एक्सएमएल / इमेज फाइलों के साथ भर सकते हैं या जो भी हो और /app/data/समय के साथ और अधिक निर्देशिकाएं जोड़ सकते हैं क्योंकि आपके ऐप के लिए स्टोरेज की जरूरत है (README.md फ़ाइलों के साथ प्रत्येक स्टोरेज निर्देशिका के विवरण में जला देने के लिए ठीक ठीक)।

प्रत्येक नई निर्देशिका के लिए .gitignoreनया बनाकर अपने या विकेन्द्रीकरण को बदलने की कोई आवश्यकता नहीं है .gitignore। शायद सबसे बुद्धिमान समाधान नहीं है लेकिन यह गिटिनोरोर-वार है और हमेशा मेरे लिए काम करता है। अच्छा और सरल! ;)




कभी-कभी मेरे पास फ़ोल्डर्स के साथ रिपोजिटरी होती है जिसमें केवल "सामग्री" के रूप में माना जाने वाली फाइलें होंगी -यह है, वे ऐसी फ़ाइलें नहीं हैं जिन्हें मैं संस्करणित करने की परवाह करता हूं, और इसलिए कभी भी प्रतिबद्ध नहीं होना चाहिए। गिट की .gitignore फ़ाइल के साथ, आप पूरी निर्देशिका को अनदेखा कर सकते हैं। लेकिन ऐसे समय होते हैं जब रेपो में फ़ोल्डर होना फायदेमंद होगा। इस आवश्यकता को पूरा करने के लिए यहां एक उत्कृष्ट समाधान है।

मैंने अतीत में जो किया है, वह मेरे रेपो की जड़ पर एक .gitignore फ़ाइल डालता है, और उसके बाद फ़ोल्डर को बहिष्कृत करता है, जैसे:

/app/some-folder-to-exclude
/another-folder-to-exclude/*

हालांकि, ये फ़ोल्डर्स फिर रेपो का हिस्सा नहीं बनते हैं। आप वहां एक रीडमे फ़ाइल की तरह कुछ जोड़ सकते हैं। लेकिन फिर आपको अपने आवेदन को बताना होगा कि किसी भी रीडमी फाइलों को संसाधित करने की चिंता न करें।

यदि आपका ऐप वहां मौजूद फ़ोल्डरों पर निर्भर करता है (हालांकि खाली), तो आप केवल एक .gitignore फ़ाइल को प्रश्न में फ़ोल्डर में जोड़ सकते हैं, और दो लक्ष्यों को पूरा करने के लिए इसका उपयोग कर सकते हैं:

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

*
!.gitignore

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




Related