- Git की फ़ाइल ignore rules साझा दायरे के आधार पर तीन स्तरों में बँटी होती हैं:
.gitignore, .git/info/exclude, ~/.config/git/ignore
.gitignore repository code के साथ commit होती है, इसलिए यह उन shared rules के लिए सही जगह है जिन्हें टीम या प्रोजेक्ट में सभी पर लागू होना चाहिए
- personal files या local work files जैसी चीज़ें, जो repository में ज़रूरी तो हैं लेकिन उन्हें टीम rule बनाना उपयुक्त नहीं है, उन्हें
.git/info/exclude में रखना बेहतर है
- macOS की
.DS_Store जैसी फ़ाइलें जिन्हें हर repository में बार-बार exclude करना हो, उन्हें machine-wide ignore file ~/.config/git/ignore में रखा जा सकता है
git check-ignore -v <फ़ाइलनाम> यह पता लगाने में उपयोगी है कि कौन-सा rule किसी फ़ाइल को ignore कर रहा है, और अगर कोई matching rule नहीं है तो कोई output नहीं आता
Git ignore rules कहाँ लागू होती हैं
- Git फ़ाइल ignore rules को तीन जगहों से process कर सकता है
.gitignore
.git/info/exclude
~/.config/git/ignore
.gitignore: repository में commit होने वाले shared rules
.gitignore ignore की जाने वाली filenames लिखने की सामान्य फ़ाइल है
- यह बाकी code के साथ Git में check in होती है
.gitignore rules से match होने वाली फ़ाइलें git commands चलाते समय consider नहीं की जातीं
.git/info/exclude: repository-विशिष्ट personal rules
exclude फ़ाइल हर Git repository की .git directory के अंदर होती है
- इस फ़ाइल में किए गए बदलाव Git में check in नहीं होते
- नई Git repository में इसमें आमतौर पर कुछ lines of comments होती हैं
- यह उन फ़ाइलों के लिए उपयुक्त है जिन्हें आप सिर्फ़ उसी repository में ignore करना चाहते हैं, लेकिन
.gitignore में नहीं जोड़ना चाहते
- उदाहरण: अगर आप अपने personal workflow के लिए ज़रूरी
notes.txt को repository में commit नहीं करना चाहते, और उसे प्रोजेक्ट की .gitignore में भी नहीं जोड़ना चाहते, तो .git/info/exclude में notes.txt जोड़ सकते हैं
~/.config/git/ignore: machine-wide rules
- global
ignore फ़ाइल home directory के ~/.config/git/ignore में होती है
- यहाँ जो filenames जोड़ी जाती हैं, वे machine level पर globally ignore होती हैं
- यह Git में check in नहीं होती और किसी specific repository से जुड़ी नहीं होती
- यह उन फ़ाइलों के लिए अच्छी जगह है जिन्हें आप अपने कंप्यूटर की सभी Git repositories में ignore करना चाहते हैं
- उदाहरण: macOS में
.DS_Store को यहाँ जोड़ना उपयुक्त है
global ignore फ़ाइल का path बदलना
- global ignore फ़ाइल को किसी दूसरी फ़ाइल पर set किया जा सकता है
- अगर आप global Git ignore फ़ाइल के रूप में
.gitignore_global इस्तेमाल करना चाहते हैं, तो यह command चलाएँ
git config --global core.excludesFile ~/.gitignore_global
- default setting पर वापस जाने के लिए यह command चलाएँ
git config --global --unset core.excludesFile
कौन-सा rule किसी फ़ाइल को ignore कर रहा है, यह जाँचें
git check-ignore -v <फ़ाइलनाम> से आप देख सकते हैं कि कोई specific फ़ाइल किस rule की वजह से ignore हो रही है
.DS_Store कैसे ignore हो रही है, यह देखने के लिए Git repository के अंदर यह command चलाएँ
git check-ignore -v .DS_Store
- अगर repository की
.gitignore .DS_Store को ignore कर रही है, तो output उदाहरण इस तरह होगा
$ git check-ignore -v .DS_Store
.gitignore:1:.DS_Store .DS_Store
- अगर repository की
.git/info/exclude .DS_Store को ignore कर रही है, तो output उदाहरण इस तरह होगा
$ git check-ignore -v .DS_Store
.git/info/exclude:7:.DS_Store .DS_Store
- अगर global
~/.config/git/ignore फ़ाइल .DS_Store को ignore कर रही है, तो output उदाहरण इस तरह होगा
$ git check-ignore -v .DS_Store
/Users/nelson/.config/git/ignore:2:.DS_Store .DS_Store
- अगर custom global ignore फ़ाइल
.gitignore_global .DS_Store को ignore कर रही है, तो output उदाहरण इस तरह होगा
$ git check-ignore -v .DS_Store
/Users/nelson/.gitignore_global:1:.DS_Store .DS_Store
- अगर किसी specific फ़ाइल को ignore करने वाला कोई rule नहीं है, तो
git check-ignore -v command कोई output नहीं देती
3 टिप्पणियां
लगता है कि work Spec या
plan.mdजैसी फ़ाइलों को.git/info/excludeमें डालना भी उपयोगी होगाअच्छा, इसे root में भी सेट किया जा सकता है haha
Hacker News की राय
दिलचस्प लेख है, लेकिन Git में मेरी पसंदीदा लगभग-ignore सुविधा
.gitattributesछूट गई हैइस फ़ाइल से आप Git को कुछ फ़ाइलों के differences "ignore" करने के लिए कह सकते हैं। उदाहरण के लिए, Node प्रोजेक्ट में
package-lock.jsonGit के नज़रिए से लगभग शुद्ध noise जैसा होता है। इसमें लाइब्रेरी के exact versions वाले बहुत बड़े differences दिखते हैं, जबकि इंसानों के पढ़ने लायक असली version जानकारी अलगpackage.jsonमें होती हैअगर प्रोजेक्ट रूट के
.gitattributesमेंpackage-lock.json -diffकी एक लाइन जोड़ दें, तो फ़ाइल stage/commit होती रहेगी लेकिनgit diffमें बेकार के विशाल differences नहीं दिखेंगेpackage-lock.jsonको noise नहीं होना चाहिए। अगर आप उसे जानबूझकर update नहीं कर रहे हैं, तो उसे बदलना ही नहीं चाहिए, नहीं तो आप बिना वजह supply chain risk के सामने आ जाते हैंअगर
package-lock.jsonमें बदलाव बार-बार अनपेक्षित रूप से हो रहे हैं, तो आप कुछ गलत कर रहे हैंpackage-lock.jsonसभी transitive dependencies दिखाता है, जबकिpackage.jsonसिर्फ direct dependencies दिखाता है। इसलिए यह कहना कि बाद वाला ही "इंसानों के पढ़ने लायक असली version" है, सही नहीं हैदोनों के उद्देश्य अलग हैं, और यह कहना खतरनाक है कि lock file के differences हमेशा ignore किए जा सकते हैं
git difflock file के differences न दिखाए तो यह सच में बहुत खीझ दिलाने वाला होगामैं समझ सकता हूँ कि यह line-by-line noise जैसा लग सकता है, लेकिन ज़रूरत पड़ने पर यह बहुत ज़रूरी होता है
global/user-level exclude settings एक ऐसी सुविधा है जिसे और ज़्यादा लोगों को जानना चाहिए। मुझे अक्सर ऐसे बदलाव मिलते हैं जिनमें IDE/OS/AI से जुड़ी फ़ाइलें हर प्रोजेक्ट की
.gitignoreमें जोड़ने की कोशिश की जाती है, और जब आप बताते हैं कि इन्हें standard settings में डालने से वे हर जगह ignore हो जाएँगी, हर प्रोजेक्ट को छूना नहीं पड़ेगा, और.gitignoreupdate न किए गए प्रोजेक्ट्स में गलती से commit होने का जोखिम भी घटेगा, तो ज़्यादातर लोग खुश होते हैंमेरा निजी सिद्धांत है कि repository के अंदर की
.gitignoreसिर्फ repository-specific items जैसे build outputs, dependency folders वगैरह के लिए होनी चाहिए, और ज़्यादातर user tools की चीज़ें हर व्यक्ति की अपनी user settings में रहनी चाहिए.gitignoresetting के बारे में बार-बार बताना, repository के अंदर की.gitignoreको सिर्फ repository-specific items तक सीमित रखने के सिद्धांत का स्वाभाविक नतीजा हैअगर सबका समय बचाना है, तो बेहतर है कि ऐसे files को बस हर project की
.gitignoreमें डाल दिया जाए.gitignoreमें डालता आया हूँ ताकि लोग अज्ञानता में उन्हें project में जोड़ न देंआखिरकार बाद में उन्हें Git से हटाना ही पड़ेगा, और उस व्यक्ति को तकलीफ़ होगी, तो मैंने शिष्टाचारवश पहले से रोक लगा दी। आगे से शायद मैं इतना शिष्ट न रहूँ
gitignoreवाला तरीका पसंद करता हूँ क्योंकि dev container को rebuild करने पर भी यह बचा रहता हैअगर
gitignoreसे बचना हो, तो generated scripts या volumes से settings restore/maintain की जा सकती हैं, लेकिन तब.gitignoreकी एक लाइन की जगह अतिरिक्त scripts याdevcontainermount settings चाहिए होंगीglobal Git config और ignore files के लिए मेरा मानना है कि
~/.gitignore_globalबनाकर config बदलने से बेहतर है~/.config/git/ignoreऔर~/.config/git/configका इस्तेमाल करनाअगर आप
~/.config/को कई कामों के लिए इस्तेमाल करें, तो root-level dotfiles काफ़ी छोटे हो जाते हैंGit exclude कम इस्तेमाल होने की वजह यह है कि वह repository में commit नहीं होता, इसलिए जब भी आप उसे इस्तेमाल करना चाहें, उसे फिर से बनाना पड़ता है। इसका मतलब यह नहीं कि वह बुरा है, बस कम इस्तेमाल होने की वजह यही है
~/.configdirectory को version control में रखें तो बाद के edits और sharing आसान हो जाते हैं~/.cvsignoreभी इस्तेमाल कर सकते हैंपता नहीं मैंने यह कहाँ सीखा, लेकिन मैंने global Git ignore में
atticजोड़ रखा हैइससे मैं किसी भी project में
atticdirectory बना सकता हूँ, जहाँ ऐसी तरह-तरह की चीज़ें रख सकूँ जिन्हें कभी commit नहीं करना चाहिए। अभी तक मैंने कोई repository नहीं देखी जो सच में ऐसी directory की जाँच करती होअगर
atticजैसी directory हो, तो उसके अंदरattic/.gitignoreबनाकर/**डाल दें; तब वह directory और उसके अंदर की हर चीज़ ignore हो जाएगी, और ignore file खुद भी ignore हो जाएगीमैं आमतौर पर अपने version में directory का नाम एक U+1F4A9 character रखता हूँ, लेकिन HN उसे comment में डालने नहीं देता
auxइस्तेमाल करता हूँउसके अंदर सिर्फ एक asterisk
*वाली.gitignoreरखकर मैं उसे छिपा देता हूँ; इससे वह खुद और उसके अंदर की हर चीज़ ignore हो जाती है.localरखता हूँscratch/हैअभी तक इसने मुझे फँसाया नहीं है
per-user ignores के बारे में, अगर आप macOS पर हैं तो वहाँ
.DS_Storeजोड़ना आदर्श माना जाता है, लेकिन तब project के हर Mac user को ऐसा करना पड़ेगाअगर दो या उससे ज़्यादा लोग हों, तो शायद इसे हर व्यक्ति पर छोड़ना सही न हो
~/.gitignore_globalfile में.DS_Storeentry है, और global Git config में भी उस file की entries को ignore करने वाली setting मौजूद हैनए Mac में इस file की तारीख़ order देने से दो दिन पहले की है, और मुझे याद नहीं कि मैंने यह खुद सेट किया हो, इसलिए लगता है यह default में आया था। पुराने Mac में भी शायद ऐसा ही रहा होगा, और macOS versions को देखकर लगता है कि यह default काफ़ी समय से ऐसा हो सकता है
इसलिए शायद अब वह दौर खत्म हो गया है जब
.DS_Store/को.gitignoreमें जोड़ना पड़ता थावाह, मुझे यह पहले कैसे नहीं पता था? मैं 20 साल के अनुभव वाला professional software developer हूँ, और अब तक सिर्फ
.gitignoreही इस्तेमाल करता रहा हूँमुझे यह भी कभी सूझा नहीं कि
.gitignoreको सिर्फ अपनी ज़रूरत के exclude items से भरने से बेहतर कोई तरीका हो सकता है। मैंने बस दुनिया को जैसा दिखा, वैसा मान लियाआज दुनिया थोड़ी बेहतर लग रही है
मैं
.git/info/excludeका बहुत ज़्यादा इस्तेमाल करता हूँ। यह उन scripts/Makefileके लिए बहुत अच्छा है जो सिर्फ local use के लिए हों और collaborators को न चाहिएँ, या वे उन्हें इस्तेमाल ही न कर सकेंgit statusमें दिखने वाली सभी untracked files को.git/info/excludeमें ठेल देती हैआमतौर पर मैं इसे repository में डालनी वाली चीज़ों को
addऔरcommitकरने के बाद चलाता हूँकई repositories वाले project directory में project-level Git settings अलग तरह से लागू करने के लिए मैं excludes file का ऐसे इस्तेमाल करता हूँ
https://laszlo.nu/blog/project-level-git-config.html
इस विषय पर कुछ aliases हैं जिन्हें मैं इस्तेमाल करता हूँ
assume = update-index --assume-unchangedunassume = update-index --no-assume-unchangedassumed = "!git ls-files -v | grep ^h | cut -c 3-"unassumeall = "!git assumed | xargs git update-index --no-assume-unchanged"assumeall = "!git st -s | awk {'print $2'} | xargs git assume"पहले से tracked files के लिए
git update-index --[no]-skip-worktreeभी हैयह local experiments में काम आ सकता है, लेकिन Git इसे कहीं बहुत स्पष्ट रूप से दिखाता नहीं, इसलिए इस्तेमाल थोड़ा झंझट वाला है। आपको याद रखना पड़ता है कि आपने इसे सेट किया है, और अगर भूल जाएँ तो checkout जैसी दूसरी operations रुक सकती हैं