मैं एक निर्देशिका में Git में फ़ाइलों को कैसे अनदेखा करूं?


544

.gitignoreएक निर्देशिका में फ़ाइलों को अनदेखा करने के लिए फ़ाइल के लिए उचित सिंटैक्स क्या है ?

क्या यह होगा

config/databases.yml
cache/*
log/*
data/sql/*
lib/filter/base/*
lib/form/base/*
lib/model/map/*
lib/model/om/*

या

/config/databases.yml
/cache/*
/log/*
/data/sql/*
/lib/filter/base/*
/lib/form/base/*
/lib/model/map/*
/lib/model/om/*

?


5
.gitignoreफ़ाइलों और निर्देशिकाओं के बीच अंतर करता है जिसे वह अनदेखा करता है? उदाहरण के लिए, dataबनाम data/अलग-अलग चीजों का मतलब है?
चार्ली पार्कर

6
@CharlieParker Yes-ish: dataउन फ़ाइलों और निर्देशिकाओं data/को अनदेखा करेगा , जो मेल खाते हैं, केवल उन्हीं निर्देशिकाओं को अनदेखा करेंगे जो मैच करती हैं।
जॉक्स

हमेशा याद रखें कि आपने जिस फ़ाइल को अनदेखा करने की कोशिश कर रहे हैं, उसका मंचन किया है या नहीं किया है, तो इसे नज़रअंदाज़ करने का कोई तरीका नहीं है :( सिर्फ मेरे 2 सेंट यह सोचने के बाद कि मेरा पैटर्न गलत हो गया है और एक घंटे का एक चौथाई समय बर्बाद कर रहा है।
एडम

@ ठीक है कि आपको अपडेट करना होगा। इसके बाद .stignore / git rm - फाइल को कैश करें।
क्रिस मैककेथ

जवाबों:


374

पैटर्न प्रारूप

  • एक रिक्त रेखा बिना फ़ाइलों से मेल खाती है, इसलिए यह पठनीयता के लिए विभाजक के रूप में काम कर सकती है।

  • एक लाइन के साथ शुरू #एक टिप्पणी के रूप में कार्य करता है।

  • एक वैकल्पिक उपसर्ग !जो पैटर्न को नकारता है; पिछले पैटर्न द्वारा बहिष्कृत कोई भी मिलान फ़ाइल फिर से शामिल हो जाएगी। यदि एक नकारात्मक पैटर्न से मेल खाता है, तो यह निम्न पूर्ववर्ती पैटर्न स्रोतों को ओवरराइड करेगा।

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

  • यदि पैटर्न में स्लैश नहीं है /, तो git इसे शेल ग्लोब पैटर्न के रूप में मानता है और .gitignoreफ़ाइल के स्थान के सापेक्ष पथनाम के विरुद्ध मैच के लिए जाँच करता है (यदि .gitignoreफ़ाइल से नहीं तो वर्क ट्री के टॉपवेल के सापेक्ष )।

  • अन्यथा, git झंडे के fnmatch(3)साथ उपभोग के लिए उपयुक्त शेल गोला के रूप में पैटर्न को मानता है: पैटर्न में FNM_PATHNAMEवाइल्डकार्ड /pathname में मेल नहीं खाएगा । उदाहरण के लिए, Documentation/*.htmlमेल खाता है या Documentation/git.htmlनहीं ।Documentation/ppc/ppc.htmltools/perf/Documentation/perf.html

  • एक प्रमुख स्लैश pathname की शुरुआत से मेल खाता है। उदाहरण के लिए, /*.cमैच cat-file.cलेकिन नहीं mozilla-sha1/sha1.c

आप यहां अधिक पा सकते हैं

git help gitignore
या
man gitignore


2
मैं शीर्ष स्तर पर .gitignore फ़ाइल कैसे डाल सकता हूं और इसके नीचे किसी भी फ़ोल्डर के लिए काम कर सकता हूं? धन्यवाद।
रॉय

104
-1 टीएल; डीआर और मुश्किल से सवाल का जवाब देता है। यह निर्देशिकाओं के बारे में है, फाइलों के बारे में नहीं, इसलिए बोल्डिफाइड सेक्शन केवल कुछ मानसिक जिम्नास्टिक के साथ एप्रोपोस है। @ जेफ्रोमी अधिक प्रत्यक्ष थे।
बॉब स्टीन

मैंने आदमी को पढ़ा है, और @ Jefromi का जवाब बेहतर है - इसलिए जब तक आप @ jox की चेतावनी भी पढ़ते हैं - और @ ल्यूक हट्टन जैसे उदाहरण के लिए IDE प्रोजेक्ट फ़ाइलों को अनदेखा करना अधिक उपयोगी हो सकता है।
विच

1
यह वास्तव में git प्रलेखन से कॉपी-पेस्ट है
mcont

1
निश्चित नहीं (अनिवार्य रूप से) एक manपृष्ठ या आधिकारिक डॉक्टर को कॉपी-पेस्ट करना एसओ के लिए सबसे अच्छा प्रारूप है ...
jdk1.0

183

यह पूर्व होगा। एक्सटेंशन के साथ-साथ फ़ोल्डर संरचना के बजाय जाओ।

यानी मेरे उदाहरण C # विकास की अनदेखी फ़ाइल:

#OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

अपडेट करें

मुझे लगा कि मैं नीचे दी गई टिप्पणियों से एक अपडेट प्रदान करूंगा। यद्यपि ओपी के प्रश्न का सीधे उत्तर नहीं दिया गया है, .gitignoreसिंटैक्स के अधिक उदाहरणों के लिए निम्नलिखित देखें ।

सामुदायिक विकि (लगातार अद्यतन किया जा रहा है):

विजुअल स्टूडियो प्रोजेक्ट्स और सॉल्यूशंस के लिए .ignignore

विशिष्ट भाषा उपयोग के साथ और अधिक उदाहरण यहां पाए जा सकते हैं (क्रिस मैककॉन की टिप्पणी के लिए धन्यवाद):

https://github.com/github/gitignore


5
@Stallman, वह है range। इसलिए यह मेल *.Objभी खाता है *.obj
नोर्बर्ट

131

जिन रास्तों पर स्लैश होते हैं, उन्हें .gitignore फ़ाइल वाली निर्देशिका के सापेक्ष लिया जाता है - आमतौर पर आपकी रिपॉजिटरी का शीर्ष स्तर, हालांकि आप उन्हें उपनिर्देशिकाओं में भी रख सकते हैं।

इसलिए, चूंकि आपके द्वारा दिए गए सभी उदाहरणों में, पथ में स्लैश हैं, दो संस्करण समान हैं। एक ही समय में आपको एक प्रमुख स्लैश डालने की आवश्यकता होती है जब पहले से ही मार्ग में कोई नहीं होता है । उदाहरण के लिए, केवल भंडार के शीर्ष स्तर पर फू को अनदेखा करने के लिए, उपयोग करें /foo। बस लेखन fooकहीं भी foo नामक कुछ भी भंडार में उपेक्षा करेगा।

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

lib/model/om

वाइल्डकार्ड्स का उपयोग करने का एकमात्र कारण आपके पास है यदि आप बाद में निर्देशिका में किसी चीज़ को अनदेखा करने का इरादा रखते हैं:

lib/model/om/*      # ignore everything in the directory
!lib/model/om/foo   # except foo

5
इस प्रश्न के लिए स्वीकृत उत्तर की तुलना में बेहतर व्याख्या
eerrzz

78

एक प्रमुख स्लैश इंगित करता है कि अनदेखा प्रविष्टि केवल उस निर्देशिका के संबंध में मान्य है जिसमें .ignignore फ़ाइल रहती है। निर्दिष्ट *.oकरना इस निर्देशिका में सभी .o फाइलों को अनदेखा करेगा और सभी उपखंडों में, जबकि /*.oउन्हें केवल उस dir में अनदेखा किया जाएगा, जबकि फिर से, /foo/*.oउन्हें केवल /foo/*.o में अनदेखा किया जाएगा।


34

यदि आप एक .gitignore फ़ाइल को शीर्ष स्तर पर रखना चाहते हैं और इसे नीचे दिए गए किसी भी फ़ोल्डर के लिए काम करते हैं /**/

*.mapएक /src/main/फ़ोल्डर और उप-फ़ोल्डर में सभी फ़ाइलों को अनदेखा करने के लिए उदा :

/src/main/**/*.map

मुझे ऐसा करने की जरूरत थी। निश्चित नहीं कि आपको दो ** की आवश्यकता क्यों है । एक मेरे लिए काफी था।
नोवोकेन

8
** उपनिर्देशिकाओं में भी फाइलें मेल खाता है
पेटर्सिन

जानकारी @petrsyn के लिए धन्यवाद
नोवोकेन

30

प्रश्न में दोनों उदाहरण वास्तव में बहुत खराब उदाहरण हैं जो डेटा हानि का कारण बन सकते हैं!

मेरी सलाह: /*जब तक आपके पास एक अच्छा कारण नहीं है, तब तक .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 विकास सूची में और देखें कि वे इसके बारे में क्या सोचते हैं।


15

यह होगा:

config/databases.yml
cache
log
data/sql
lib/filter/base
lib/form/base
lib/model/map
lib/model/om

या संभवतः भी:

config/databases.yml
cache
log
data/sql
lib/*/base
lib/model/map
lib/model/om

यदि ऐसा हो filterऔर formकेवल उसी निर्देशिका में हों, जिसमें एक baseउपनिर्देशिका हो जिसे अनदेखा किया जाना चाहिए (इसे उदाहरण के रूप में देखें कि आप तारांकन के साथ क्या कर सकते हैं)।


14

पहले वाला। वे फ़ाइल पथ आपके सापेक्ष .gitignore फ़ाइल से संबंधित हैं।


2
यह केवल उन पैटर्न के लिए सही है जिसमें स्लैश होता है। "Mydir" जैसे एकल निर्देशिका नाम उन निर्देशिकाओं (और फ़ाइलों) को भी अनदेखा कर देगा जो किसी भी गहराई पर सबफ़ोल्डर में स्थित हैं। केवल एक स्लैश को सामने रखने से यह आपके रिश्तेदार से संबंधित हो जाएगा। आपकी .ignignore फ़ाइल कहां है।
21

4

मैं एक GUI और CLI आधारित सेवा बना रहा हूँ, जिससे आप https://www.gitignore.io.gitignore पर बहुत आसानी से टेम्पलेट तैयार कर सकते हैं ।

आप या तो उन टेम्प्लेट को टाइप कर सकते हैं जिन्हें आप खोज क्षेत्र में चाहते हैं या कमांड लाइन उर्फ ​​स्थापित करें और चलाएं

$ gi swift,osx


0

एक नमूना .gitignore फ़ाइल Android Studio प्रोजेक्ट के लिए नीचे की तरह दिख सकती है

# built application files
*.apk
*.ap_

# files for the dex VM
*.dex

# Java class files
*.class

# generated files
bin/
gen/

# Local configuration file (sdk path, etc)
local.properties


#Eclipse
*.pydevproject
.project
.metadata
bin/**
tmp/**
tmp/**/*
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath
YourProjetcName/.gradle/
YourProjetcName/app/build/
*/YourProjetcName/.gradle/
*/YourProjetcName/app/build/

# External tool builders
.externalToolBuilders/

# Locally stored "Eclipse launch configurations"
*.launch

# CDT-specific
.cproject

# PDT-specific
.buildpath

# Proguard folder generated by Eclipse
proguard/

# Intellij project files
*.iml
*.ipr
*.iws
.idea/
/build
build/
*/build/
*/*/build/
*/*/*/build/
*.bin
*.lock
YourProjetcName/app/build/
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
.gradle/
app/build/
*app/build/

# Local configuration file (sdk path, etc)
local.properties
/YourProjetcName/build/intermediates/lint-cache/api-versions-6-23.1.bin
appcompat_v7_23_1_1.xml
projectFilesBackup
build.gradle
YourProjetcName.iml
YourProjetcName.iml
gradlew
gradlew.bat
local.properties
settings.gradle
.gradle
.idea
android
build
gradle
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.