"स्क्रिप्टिंग" Git को मज़बूती से करने के लिए कुंजी 'प्लंबिंग' कमांड का उपयोग करना है।
प्लंबिंग कमांड को बदलते समय डेवलपर्स यह सुनिश्चित करते हैं कि वे बहुत स्थिर इंटरफेस प्रदान करते हैं (जैसे कि रिपॉजिटरी स्टेट, स्टड, कमांड लाइन विकल्प, तर्क आदि का एक दिया गया संयोजन) Git के सभी संस्करणों में समान आउटपुट उत्पन्न करेगा जहां कमांड / विकल्प मौजूद है)। प्लंबिंग कमांड्स में नए आउटपुट विविधताओं को नए विकल्पों के माध्यम से पेश किया जा सकता है, लेकिन यह उन कार्यक्रमों के लिए कोई समस्या नहीं ला सकता है जो पुराने संस्करणों के खिलाफ पहले से ही लिखे गए हैं (वे नए विकल्पों का उपयोग नहीं करेंगे, क्योंकि वे मौजूद नहीं थे (या कम से कम थे) उपयोग नहीं किया गया) उस समय स्क्रिप्ट लिखी गई थी)।
दुर्भाग्य से 'रोज़' गित कमांड 'पोर्सिलेन' कमांड हैं, इसलिए अधिकांश गिट उपयोगकर्ता प्लंबिंग कमांड से परिचित नहीं हो सकते हैं। चीनी मिट्टी के बरतन और प्लंबिंग कमांड के बीच अंतर मुख्य गिट मैनपेज में किया जाता है ( उच्च-स्तरीय कमांड (चीनी मिट्टी के बरतन) और निम्न-स्तरीय कमांड (प्लंबिंग) शीर्षक वाले उपखंड देखें ।
अनियोजित परिवर्तनों के बारे में जानने के लिए, आपको git diff-index
कुछ अन्य ट्रीशिश (जैसे HEAD
) के विरुद्ध इंडेक्स (और शायद काम करने वाले पेड़ के बिट्स की git diff-files
तुलना ) की आवश्यकता होगी, हो सकता है (इंडेक्स के खिलाफ काम करने वाले पेड़ की तुलना), और संभवतः git ls-files
(सूची फ़ाइलें; उदाहरण के लिए सूची अनट्रेक्टेड) , अहस्ताक्षरित फ़ाइलें)।
(ध्यान दें कि नीचे दिए गए आदेशों में, HEAD --
इसके बजाय इसका उपयोग किया जाता है , HEAD
अन्यथा यदि कोई फ़ाइल नाम की है तो आदेश विफल हो जाता है HEAD
।)
यह जाँचने के लिए कि क्या एक भंडार ने परिवर्तनों का मंचन किया है (अभी तक प्रतिबद्ध नहीं) इसका उपयोग करें:
git diff-index --quiet --cached HEAD --
- यदि यह बाहर निकलता है
0
तो कोई मतभेद नहीं थे ( 1
मतलब अंतर थे)।
यह जाँचने के लिए कि क्या एक कार्यशील पेड़ में परिवर्तन हैं जिनका मंचन किया जा सकता है:
git diff-files --quiet
- बाहर निकलने का कोड
git diff-index
( 0
== कोई मतभेद नहीं; 1
== मतभेद) के समान है।
यह जाँचने के लिए कि क्या वर्क ट्री में इंडेक्स और ट्रैक की गई फ़ाइलों का संयोजन सम्मान के साथ बदलता है HEAD
:
git diff-index --quiet HEAD --
- यह पिछले दो के संयोजन की तरह है। एक मुख्य अंतर यह है कि यह तब भी "कोई अंतर नहीं" रिपोर्ट करेगा यदि आपके पास काम के पेड़ में "पूर्ववत" है कि आपके पास एक परिवर्तन है (वापस सामग्री में हैं
HEAD
)। इसी स्थिति में, दो अलग-अलग कमांड "अंतर मौजूद" की रिपोर्ट लौटाएंगे।
आपने अनटैक की गई फ़ाइलों का भी उल्लेख किया। आपका मतलब हो सकता है "अनट्रैक और अनरिजर्व्ड", या आपका मतलब सिर्फ सादा "अनट्रैक" (अनदेखा फ़ाइलों सहित) हो सकता है। किसी भी तरह से, git ls-files
काम के लिए उपकरण है:
"अनट्रैक" के लिए (यदि मौजूद हो तो अनदेखा फ़ाइलें शामिल होंगी):
git ls-files --others
"अनट्रैकड एंड अनइग्नोरड" के लिए:
git ls-files --exclude-standard --others
मेरा पहला विचार सिर्फ यह जांचना है कि क्या इन कमांड में आउटपुट है:
test -z "$(git ls-files --others)"
- यदि यह बाहर निकलता है,
0
तो कोई भी फ़ाइल नहीं हैं। अगर इसके साथ बाहर निकलता है 1
तो अनट्रैक फाइलें हैं।
एक छोटा सा मौका है कि यह असामान्य निकास से git ls-files
"नो अनट्रैक फाइल्स" रिपोर्ट (उपरोक्त कमांड के गैर-शून्य निकास में दोनों परिणाम) का अनुवाद करेगा। थोड़ा और मजबूत संस्करण इस तरह दिख सकता है:
u="$(git ls-files --others)" && test -z "$u"
- विचार पिछले कमांड के समान है, लेकिन यह अप्रत्याशित त्रुटियों
git ls-files
को बाहर फैलाने की अनुमति देता है। इस मामले में एक गैर-शून्य निकास का मतलब "अनट्रैक फाइल्स हैं" या इसका मतलब यह हो सकता है कि कोई त्रुटि हुई है। यदि आप चाहते हैं कि "त्रुटि" परिणाम "नहीं अनट्रैक फाइल्स" परिणाम के साथ संयुक्त है, तो इसका उपयोग करें test -n "$u"
(जहां 0
"कुछ अनट्रैक की गई फाइलें" का अर्थ है, और गैर-शून्य का मतलब है त्रुटि या "कोई अनट्रैक की गई फाइलें")।
एक अन्य विचार यह है कि --error-unmatch
जब गैर-शून्य फ़ाइलें न हों तो गैर-शून्य निकास का उपयोग करें। यह "कोई 1
त्रुटि नहीं हुई" (गैर-शून्य से बाहर निकलना, लेकिन शायद 128
) के साथ "कोई अनकही फ़ाइलों" (बाहर निकलने ) को भ्रमित करने का जोखिम भी चलाता है । लेकिन 0
बनाम 1
बनाम शून्य-शून्य निकास कोड के लिए जाँच संभवतः काफी मजबूत है:
git ls-files --others --error-unmatch . >/dev/null 2>&1; ec=$?
if test "$ec" = 0; then
echo some untracked files
elif test "$ec" = 1; then
echo no untracked files
else
echo error from ls-files
fi
उपरोक्त git ls-files
उदाहरणों में से कोई भी --exclude-standard
आप ले सकते हैं यदि आप केवल अनअट्रैकड और अनरजिस्टर्ड फ़ाइलों पर विचार करना चाहते हैं।