2012-01-04 6 views
21

क्या कोई मौजूदा कमांड है, या कुछ चाल या स्क्रिप्ट है जो मुझे "ls" में दिखाए गए फ़ाइलों की स्थिति दिखाने की अनुमति देती है?गिट स्थिति की जानकारी के साथ "एलएस" बढ़ाया?

कुछ निम्नलिखित की तरह:

$ git ls status #Command could be anything `lsg` is fine too, whatever. 

app   contents modified 
autotest  up-to-date 
config  up-to-date 
config.ru  staged 
db   contents modified 
doc   contents modified 
Gemfile  modified 
Gemfile.lock modified 
lib   up-to-date 
log   up-to-date 
public  up-to-date 
Rakefile  up-to-date 
README  up-to-date 
script  up-to-date 
spec   up-to-date 
tmp   up-to-date 
vendor  contents modidified 
test.tmp  removed 

किसी भी तरह से: एक निर्देशिका सूची में Git स्थिति की जानकारी उपलब्ध हो रही है।

+5

आप क्या तर्क है 'Git status' पर इस प्रारूप का लाभ है? – Nate

+1

@Nate: यह एक बेहतर birdseye, आईएमओ प्रदान करता है। विशेष रूप से उपयोगी अगर कई फाइलें बदली गईं। लेकिन पूरे डीआईआर-लिस्टिंग के संदर्भ में परिवर्तन देखने के लिए उपयोगी है। – berkes

+1

निकटतम संभवतः 'गिट स्टेटस-एस' है, लेकिन यह – fge

उत्तर

10

गिट स्थिति short format जानकारी का उपयोग करके, यहां एक बैश स्क्रिप्ट है जो आपको अनुकूलित स्थिति आउटपुट देने के लिए Awk और column कमांड का उपयोग करती है।

#!/bin/bash 
git status --porcelain | \ 
    awk 'BEGIN {FS=" "} 
{ 
    xstat = substr($0, 1, 1); 
    ystat = substr($0, 2, 1); 
    f = substr($0, 4); 
    ri = index(f, " -> "); 
    if (ri > 0) f = substr(f, 1, ri); 
    if (xstat == " " && ystat ~ "M|D") stat = "not updated"; 
    else if (xstat == "M" && ystat ~ " |M|D") stat = "updated in index"; 
    else if (xstat == "A" && ystat ~ " |M|D") stat = "added to index"; 
    else if (xstat == "D" && ystat ~ " |M") stat = "deleted from index"; 
    else if (xstat == "R" && ystat ~ " |M|D") stat = "renamed in index"; 
    else if (xstat == "C" && ystat ~ " |M|D") stat = "copied in index"; 
    else if (xstat ~ "M|A|R|C" && ystat == " ") stat = "index and work tree matches"; 
    else if (xstat ~ " |M|A|R|C" && ystat == "M") stat = "work tree changed since index"; 
    else if (xstat ~ " |M|A|R|C" && ystat == "D") stat = "deleted in work tree"; 
    else if (xstat == "D" && ystat == "D") stat = "unmerged, both deleted"; 
    else if (xstat == "A" && ystat == "U") stat = "unmerged, added by us"; 
    else if (xstat == "U" && ystat == "D") stat = "unmerged, deleted by them"; 
    else if (xstat == "U" && ystat == "A") stat = "unmerged, added by them"; 
    else if (xstat == "D" && ystat == "U") stat = "unmerged, deleted by us"; 
    else if (xstat == "A" && ystat == "A") stat = "unmerged, both added"; 
    else if (xstat == "U" && ystat == "U") stat = "unmerged, both modified"; 
    else if (xstat == "?" && ystat == "?") stat = "untracked"; 
    else if (xstat == "!" && ystat == "!") stat = "ignored"; 
    else stat = "unknown status"; 
    print f " " stat; 
}' | \ 
    column -t -s " " 

आप अपने PATH ($HOME/bin होना चाहिए एक अच्छी जगह) पर एक निर्देशिका में एक निष्पादन git-status-ls बनाते हैं, तो आप किसी भी Git रेपो में git status-ls लिख सकते हैं। या आप इसके लिए एक गिट उर्फ ​​एक-लाइनर बना सकते हैं। आप पर्ल, पायथन, सी या जो भी भाषा आप सबसे अधिक आरामदायक हैं, का उपयोग करके इसे कार्यान्वित भी कर सकते हैं।

B        renamed in index 
A        untracked 
dont_delete_git_pre-commit_hook untracked 

बस एहसास हुआ, टैब रिक्त स्थान के रूप में प्रदर्शित कर रहे हैं:


यहां एक नमूना उत्पादन है। Awk स्क्रिप्ट print f " " stat; और column -t -s " " कमांड में, डबल-कोट्स के बीच एक टैब (रिक्त स्थान नहीं) है। आप टैब के अलावा एक विभाजक का उपयोग कर सकते हैं।


उपर्युक्त स्क्रिप्ट में हैंडलिंग स्थिति झंडे के साथ कोई समस्या नहीं है और इसे ठीक किया गया है।

+0

यह अपरिवर्तित फ़ाइलों का" संदर्भ "नहीं दिखाएगा। लेकिन मुझे लगता है कि मैं अन्य सभी फाइलों को जोड़ने के लिए भी इसके साथ शुरुआत कर सकता हूं। – berkes

+2

जैसा कि, यह स्क्रिप्ट आपको बताएगी कि क्या किया जाएगा/क्या किया जा सकता है। ऐसा लगता है कि अनमोडिफाइड ट्रैक की गई फ़ाइलों को सूचीबद्ध करने के लिए कुछ काम की आवश्यकता होगी; मुझे एक त्वरित समाधान नहीं मिल रहा है। –

-1

यह मिलना चाहिए आप आरंभ:

$ (git ls-files -o|sed -e 's/$/ untracked/'; \ 
    git ls-files -m|sed -e 's/$/contents modified/') | 
    sort 

अन्य झंडे कि आप उपयोग कर सकते हैं के लिए git help ls-files देखें।

आप उपयोग करने के लिए अपने खोल builtin printf उत्पादन तरीका है अपने उदाहरण में तुम्हारे पास है संरेखित करने के लिए चाहते हो सकता है:

$ (git ls-files -o|sed -e 's/$/ untracked/'; \ 
git ls-files -m|sed -e 's/$/ contents modified/') | 
    sort | 
    while read file stat 
    do 
     printf "%-30s%-20s\n" $file $stat 
    done 
+0

मैं यह देखने में असफल रहा कि निर्देशिका निर्देशिका पर रिपोर्ट करने के लिए git ls-files का उपयोग कैसे किया जा सकता है; यानी सभी रिकर्सिव जानकारी नहीं दिखाएं – berkes

संबंधित मुद्दे