बताएं कि कौन सा gitignore नियम मेरी फ़ाइल को अनदेखा कर रहा है


310

क्या यह देखने का कोई तरीका है कि कुछ फ़ाइल को git द्वारा अनदेखा क्यों किया जा रहा है (अर्थात किसी .gitignoreफ़ाइल में कौन सा नियम फ़ाइल को अनदेखा कर रहा है)?

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

/
-.gitignore
-folder/
    -.gitignore
    -subfolder/
              -.gitignore
              -file.txt

अगर मैं git add folder/subfolder/file.txtजीआईटी चलाऊं तो इसकी अनदेखी हो सकती है:

The following paths are ignored by one of your .gitignore files:
folder/subfolder/file.txt
Use -f if you really want to add them.

क्या यह जानने का कोई तरीका है कि .gitignoreइस फ़ाइल को अनदेखा करने के लिए सभी संभव नियमों में से कौन सा नियम है, और नियम भी दिखाएं? पसंद:

The following paths are ignored by your folder/.gitignore file (line 12: *.txt)
folder/subfolder/file.txt
Use -f if you really want to add them.

या केवल:

$ git why-is-ignored folder/subfolder/file.txt
folder/.gitignore:12:*.txt

4
नोट: git check-ignoreजल्द ही (git1.8.5 / 1.9) के पास एक --no-indexविकल्प है। देखें नीचे मेरा उत्तर
VonC

नोट: GIT_TRACE_EXCLUDE=1 git statusजल्द ही .gitignoreनियमों को डीबग करने का एक अतिरिक्त तरीका होगा । देखें नीचे मेरी संपादित जवाब
VonC

प्रासंगिक ब्लॉग पोस्ट: danielcompton.net/2016/04/21/…
krlmlr

जवाबों:


643
git check-ignore -v filename

देखें आदमी पेज अधिक जानकारी के लिए।

मूल उत्तर इस प्रकार है:

git वर्तमान में ऐसा कुछ भी प्रदान नहीं करता है। लेकिन आपके सवाल को देखने के बाद मैंने कुछ गुगली की और पाया कि 2009 में वापस इस सुविधा का अनुरोध किया गया था और आंशिक रूप से लागू किया गया था । धागा पढ़ने के बाद, मुझे एहसास हुआ कि इसे ठीक से करने के लिए बहुत अधिक काम नहीं होगा, इसलिए मैंने एक पैच पर काम शुरू कर दिया है और अगले दो या दो दिनों में इसे पूरा करने की उम्मीद है। जब यह तैयार हो जाएगा तो मैं इस जवाब को अपडेट कर दूंगा।

अद्यतन: वाह, यह मेरी अपेक्षा से बहुत कठिन था। सराय के gitबाहर संभाल काफी सहज हैं। वैसे भी, यहाँ एक लगभग समाप्त श्रृंखला है जो आज की अपस्ट्रीम masterशाखा पर लागू होती है । परीक्षण सूट 99% पूर्ण है, लेकिन मैंने --stdinअभी तक विकल्प को पूरा नहीं किया है। उम्मीद है कि मैं इस सप्ताह के अंत में प्रबंधन करूँगा, और फिर मेरे मेलिंग सूची में अपने पैच सबमिट कर दूंगा।

इस बीच, मैं निश्चित रूप से किसी का भी परीक्षण करने का स्वागत करूंगा जो ऐसा करने में सक्षम है - बस मेरे gitकांटे से क्लोन , check-ignoreशाखा की जांच करें , और इसे सामान्य रूप से संकलित करें।

अद्यतन 2: यह हो गया है! नवीनतम संस्करण ऊपर के अनुसार गिटहब पर है, और मैंने सहकर्मी की समीक्षा के लिए पैच श्रृंखला को गिट मेलिंग सूची में जमा किया है। आइए देखें कि वे क्या सोचते हैं ...

अद्यतन 3: हैकिंग / पैच समीक्षाओं / चर्चाओं / प्रतीक्षा के कई महीनों के बाद, मुझे यहmaster कहते हुए खुशी हो रही है कि यह सुविधा अब गिट की शाखा तक पहुँच गई है , और अगली रिलीज़ में उपलब्ध होगी (1.8.2, उम्मीद 8 वीं मार्च 2013)। यहां check-ignoreमैनुअल पेज है । काश, मैं उम्मीद से ज्यादा काम कर रहा था!

अद्यतन 4: यदि आप पूरी कहानी में रुचि रखते हैं कि यह उत्तर कैसे विकसित हुआ और यह सुविधा लागू की गई, तो GitMinutes पॉडकास्ट के एपिसोड 32 को देखें


2
मैं 1.8.2 का उपयोग कर रहा हूं और git check-ignoreकुछ नहीं करता।
zakdances

3
@yourfriendzak बिना किसी शक की छाया के, git check-ignoreपेश है और 1.8.2 में काम कर रहा है। यदि व्यवहार वह नहीं है जिसकी आप अपेक्षा करते हैं, तो मैं आपको सुझाव देता हूं कि आप (पुनः) मैनुअल पेज को पढ़ें, और यदि यह अभी भी नहीं है, तो कृपया गिट मेलिंग सूची पर एक उचित बग रिपोर्ट प्रस्तुत करें। सिर्फ यह कहना कि यह कुछ भी नहीं करता है बहुत उपयोगी नहीं है। मैं तो आप शायद एक गैर पर ध्यान नहीं दिया फ़ाइल पर चला और गलत तरीके से कुछ उत्पादन की उम्मीद कर रहे हैं (हालांकि मैं शायद समर्थन के लिए जोड़ देगा उम्मीद --show-unmatchedकरने के लिए --verboseउत्पादन मोड भविष्य में)।
एडम स्पीयर्स

1
@AdamSpiers तुम सही हो। मुझे निर्दिष्ट करना चाहिए कि जब मैं कमांड निष्पादित करता हूं, तो कुछ भी मुद्रित नहीं होता है। कोई त्रुटि संदेश, कोई सफलता संदेश नहीं, कोई जानकारी नहीं। बस अगला, खाली दिखावा। तो क्या मैं यह मानने के लिए सही हूँ कि कुछ परिस्थितियों में "कोई आउटपुट" अपेक्षित व्यवहार नहीं है?
zakdances

1
@AdamSpiers आपको इसके लिए बहुत बहुत धन्यवाद! 3 दिनों की जांच के बाद आपने अभी-अभी मुझे एक टूटी हुई बिल्ड के कारण को विश्व स्तर पर नजरअंदाज की गई फ़ाइल। Inignignore_global के कारण ट्रैक करने में मदद की है! मुझे यह भी नहीं पता था कि यह एक चीज़ थी!
BenBtg

3
यह रोजमर्रा की बात नहीं है कि कोई एक स्टैक ओवरफ्लो डेवलपर को डेवलपर सुविधा को लागू करने के लिए कई बदलाव करता है। वाह और सम्मान।
user3613932

18

अपडेट git 2.8 (मार्च 2016):

GIT_TRACE_EXCLUDE=1 git status

" फ़ाइल को मान्य करने का एक तरीका.gitignore देखें "

वह git check-ignore -vनीचे वर्णित पूरक है ।


मूल उत्तर: सितंबर 2013 (1.8.2 git, फिर 1.8.5+):

git check-ignore1.8.5 / 1.9 (Q4 2013) में फिर से सुधार हुआ :

" git check-ignore" उसी नियम का अनुसरण करता है जैसे " git add" और " git status" जिसमें अनदेखी / बहिष्कृत तंत्र उन रास्तों पर प्रभावी नहीं होता है जो पहले से ही ट्रैक हैं।
" --no-index" विकल्प के साथ, यह निदान करने के लिए इस्तेमाल किया जा सकता है कि किन रास्तों को अनदेखा किया जाना चाहिए, उन्हें गलती से सूचकांक में जोड़ दिया गया है

देखें 8231fa6 प्रतिबद्ध से https://github.com/flashydave :

check-ignoreवर्तमान में पता चलता है कि .gitignoreनियम कैसे अनियोजित रास्तों का इलाज करेंगे। ट्रैक किए गए रास्ते उपयोगी आउटपुट उत्पन्न नहीं करते हैं।
यह डिबगिंग को रोकता है कि क्यों एक पथ अप्रत्याशित रूप से ट्रैक किया गया जब तक कि उस पथ को पहले सूचकांक से हटा न दिया जाए git rm --cached <path>

विकल्प --no-indexआदेश को सूचकांक में होने वाले पथ के लिए चेक को बायपास करने के लिए कहता है और इसलिए ट्रैक किए गए पथों को भी जांचने की अनुमति देता है।

जब भी यह व्यवहार की विशेषताओं से विचलित होता है git addऔर git statusइसके उपयोग के मामले में किसी भी उपयोगकर्ता भ्रम की संभावना नहीं है।

सही व्यवहार सुनिश्चित करने के लिए मानक उपेक्षा के खिलाफ इस विकल्प की जांच करने के लिए टेस्ट स्क्रिप्ट को संवर्धित किया जाता है।


--no-index::

चेकों को ले जाते समय सूचकांक में न देखें।
इसका उपयोग किया जा सकता है:

  • डिबग करने के लिए कि कोई रास्ता उदा से ट्रैक क्यों हो गया git add .और उपयोगकर्ता द्वारा या अपेक्षा के अनुसार नियमों की अनदेखी नहीं की गई
  • जब पहले के साथ जोड़े गए मार्ग से मेल खाने के लिए निषेध सहित पैटर्न विकसित करना git add -f

4

मुझे मैन पेज में कुछ भी नहीं मिल रहा है, लेकिन यहां एक त्वरित और गंदी स्क्रिप्ट है जो आपकी फ़ाइल को प्रत्येक माता-पिता की निर्देशिका में देखेगा कि क्या यह git-add'ed हो सकता है। निर्देशिका में इसे समस्या फ़ाइल के रूप में चलाएँ:

test-add.sh STOP_DIR FILENAME

जहां STOP_DIRGit प्रोजेक्ट का शीर्ष स्तर निर्देशिका FILENAMEहै और समस्या फ़ाइल नाम (पथ के बिना) है। यह पदानुक्रम के प्रत्येक स्तर पर एक ही नाम की एक खाली फ़ाइल बनाता है (यदि यह मौजूद नहीं है) और git add -nयह देखने की कोशिश करता है कि क्या इसे जोड़ा जा सकता है (यह स्वयं के बाद साफ हो जाता है)। यह कुछ इस तरह का उत्पादन करता है:

FAILED:    /dir/1/2/3
SUCCEEDED: /dir/1/2

लिपी:

#!/usr/bin/env bash
TOP=$1
FILE=$2
DIR=`pwd`
while : ; do
  TMPFILE=1
  F=$DIR/$FILE
  if [ ! -f $F ]; then
    touch $F
    TMPFILE=0
  fi
  git add -n $F >/dev/null 2>&1
  if [ $? = 0 ]; then
    echo "SUCCEEDED: $DIR"
  else
    echo "FAILED:    $DIR"
  fi
  if [ $TMPFILE = 0 ]; then
    rm $F
  fi
  DIR=${DIR%/*}
  if [ "$DIR" \< "$TOP" ]; then
    break
  fi
done 

1

उपयोग करने के मुख्य उत्तर में जोड़ने के लिए git check-ignore -v filename(धन्यवाद बीटीडब्ल्यू) मैंने पाया कि मेरी .gitignore फ़ाइल सब कुछ रोक रही थी क्योंकि वाइल्डकार्ड के बाद एक नई लाइन थी, इसलिए मेरे पास थी:

* .sublime-project

उदहारण के लिए। मैंने अभी नईलाइन, और वॉइला को हटाया है! यह तय हो गया था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.