एकल सबफ़ोल्डर की गिट-स्थिति कैसे प्राप्त करें?


84

जब मैं अपनी रिपॉजिटरी के सबफ़ोल्डर में git स्टेटस करता हूँ तो इसमें पेरेंट फोल्डर की स्थिति भी शामिल होती है।

वहाँ सिर्फ एक विशेष फ़ोल्डर के लिए गिट की स्थिति विवश करने के लिए एक रास्ता है?


1
नहीं, "गिट की स्थिति।" जैसे "" ../sibling "
EoghanM

क्या आप इस बारे में थोड़ा और संदर्भ देना चाहेंगे कि आप अपने पेड़ में कहीं और बदलाव क्यों फ़िल्टर करना चाहते हैं? आप किन स्थितियों में इस सुविधा का उपयोग करना चाहेंगे?
ग्रेग बेकन

1
अगर सामान्य "git स्टेटस" कमांड से आउटपुट की स्क्रीनफुल कीमत से अधिक है
EoghanM

जवाबों:


103
git status .

वर्तमान निर्देशिका और उपनिर्देशिकाओं की स्थिति दिखाएगा।

उदाहरण के लिए, इस पेड़ में दी गई फाइलें (संख्याएँ):

a/1
a/2
b/3
b/4
b/c/5
b/c/6

उपनिर्देशिका "बी" से, git statusपूरे पेड़ में नई फाइलें दिखाता है:

% git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   ../a/1
#   new file:   ../a/2
#   new file:   3
#   new file:   4
#   new file:   c/5
#   new file:   c/6
#

लेकिन git status .सिर्फ "बी" और नीचे की फाइलों को दिखाता है।

% git status .
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   3
#   new file:   4
#   new file:   c/5
#   new file:   c/6
#

बस यह उपनिर्देशिका, नीचे नहीं

git status ."b" के नीचे सभी फ़ाइलों को पुनरावर्ती दिखाता है। "बी" में केवल फाइलें दिखाने के लिए, लेकिन नीचे नहीं, आपको बस फाइलों की एक सूची (और निर्देशिका नहीं) पास करने की आवश्यकता है git status। यह आपके शेल पर निर्भर करता है, थोड़ा सा है।

ज़श

Zsh में आप "ग्लोब क्वालिफायर" के साथ साधारण फ़ाइलों का चयन कर सकते हैं (.)। उदाहरण के लिए:

% git status *(.)
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

दे घुमा के

बैश के पास ग्लोब क्वालिफायर नहीं है, लेकिन आप findसाधारण फ़ाइलों का चयन करने के लिए GNU का उपयोग कर सकते हैं और फिर उन्हें git statusपसंद करने के लिए पास कर सकते हैं :

bash-3.2$ find . -type f -maxdepth 1 -exec git status {} +
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

यह उपयोग करता है -maxdepthजो एक GNU खोज एक्सटेंशन है। POSIX पता नहीं है -maxdepth, लेकिन आप यह कर सकते हैं:

bash-3.2$ find . -path '*/*' -prune -type f -exec git status {} +
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

2
क्षमा करें इस उत्तर पर वापस आने में इतना समय लगा - सरल और सही! मुझे आश्चर्य है कि अगर मेरे सवाल के बाद <pathspec> को git स्टेटस में जोड़ा गया?
EoghanM

क्या होगा यदि आप केवल वर्तमान फ़ोल्डर में रुचि रखते हैं जहां .इसके उप फ़ोल्डर को संदर्भित करता है, लेकिन नहीं। उसके लिए कोई काम? धन्यवाद!
बेंजामिन 16

@benjaminz आपके उपयोग पर निर्भर करता है - जैसे कि मैं फ़ाइलों का चयन करने के लिए शेल ग्लबिंग का उपयोग करता हूं, लेकिन उप-निर्देशिका नहीं, जैसे (zsh के लिए) git status *(.)। बैश के पास केवल फाइलों को ग्लोब करने का शॉर्टहैंड तरीका नहीं है, लेकिन आप एक विस्तारित findउदाहरण का उपयोग कर सकते हैं find . -type f -maxdepth 1 -exec git status {} +। ऐसा लगता है कि आप हर समय टाइप करने के बजाय किसी अन्य चीज़ या स्क्रिप्ट में रखना चाहते हैं।
मैट कर्टिस

3

कुछ प्लंबिंग कमांड पैरामीटर के रूप में एक डायरेक्टरी लेते हैं:

git ls-files -t -o -m aDirectory

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

जैसा कि इस सूत्र में लिखा गया है , git ls-files एक ' --addedविकल्प ' का समर्थन नहीं करता है।

अधिक मौलिक कारण है क्योंकि ls-filesप्लंबिंग इंडेक्स के बारे में है ।
जोड़ा सूचकांक और काम के पेड़ के बीच तुलना के बारे में नहीं है
यह HEAD कमिट और इंडेक्स के बीच है, और यह ls- फाइल प्लंबिंग से संबंधित नहीं है।

इसलिए, यहां बताई गई कमांड्स का उपयोग करें :

git diff-index --name-only -B -R -M -C HEAD src

आप दोनों गैर-जोड़ा और जोड़ा फ़ाइलों देना होगा

git diff-files --name-only -B -R -M -C src

आपको केवल गैर-जोड़ी गई फ़ाइलें देगा। (पुनर्लेखन, नाम, प्रतियाँ, का पता लगाते समय ...)

नलसाजी कमांड के साथ हमेशा की तरह, कुछ स्क्रिप्टिंग क्रम में है;)


3

अपूर्ण, लेकिन यह उस निर्देशिका के भीतर से भी काम करता है जिसमें आप रुचि रखते हैं:

git status | grep -v ' \.\./'

यह उन सभी निर्देशिकाओं को छिपाएगा जिनके लिए उनके सापेक्ष पथ में एक ऊपर की ओर संदर्भ की आवश्यकता होगी।

यदि आप दूसरे छोर से रंग थूकना चाहते हैं, तो निम्न पर सेट color.statusकरें always:

git config color.status always

2
मैं प्यार करता हूँ कि कैसे grep हमेशा एक अस्थायी समाधान प्रदान करता है यदि आप अधिक विशिष्ट एक नहीं जानते हैं। चीयर्स-बेल प्रोग्रामिंग को चीयर्स।
murftown

यह तरीका अधिक शक्तिशाली है!
बेंजामिन

3

git statusजादू शब्द का उपयोग करके एक pathspec देकर वर्तमान निर्देशिका (बच्चे फ़ोल्डर के बिना) तक सीमित करना संभव है : globऔर*:

git status ':(glob)*'

यह महान काम करता है! बिल्कुल मैं क्या खोज रहा था!
पॉइंडेक्सटर

1

जब मैंने कोशिश की, मुझे ऐसा करने का कोई तरीका नहीं मिला।

मैंने समाप्त कर दिया:

x@x:~/x$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       b
#       main/a
nothing added to commit but untracked files present (use "git add" to track)

x@x:~/x$ git status | grep main
#       main/a

यह वह विधि है जो मैं उपयोग कर रहा था ... निम्नलिखित में भी स्थिति शीर्षकों को प्राप्त होता है: git स्थिति | grep "main_: \ $" ... दुर्भाग्य से आप रंग खो देते हैं।
इओघनम

इस सवाल के पार एक सामान्य ग्लोब मैच की तलाश में आया था। यह अब तक सबसे आसान है और मेरे लिए काम करता है, जैसे git status | grep extकि एक्सटेंशन कहां है। धन्यवाद!

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