2012-01-04 10 views
21

Czy istnieje albo istniejące polecenie, albo jakaś sztuczka lub skrypt, który pozwala mi pokazać status plików pokazanych w "ls"?Poprawione "ls" z informacjami o statusie git?

Coś jak następuje:

$ 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 

W żaden sposób: o informacje o stanie git dostępny w katalogu aukcji.

+5

Co byś argumentować jest zaletą tego formatu nad 'git status'? – Nate

+1

@Nate: Oferuje lepsze birdseye, IMO. Szczególnie przydatny, gdy wiele plików zostało zmienionych. Ale również, aby zobaczyć zmiany w kontekście całej listy dir jest przydatna. – berkes

+1

Najbliższy jest prawdopodobnie 'git status -s', ale nie będzie raportował niczego poza modyfikacjami – fge

Odpowiedz

10

Przy pomocy informacji o statusie Git: short format, oto skrypt Bash, który używa Awk i polecenia column, aby uzyskać niestandardowe dane wyjściowe.

#!/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 " " 

Jeśli utworzysz plik wykonywalny git-status-ls w katalogu na swoim PATH ($HOME/bin powinny być dobre miejsce), można wpisać w dowolnym git status-ls repo Git. Można też utworzyć alias jednolinijkowy Git dla tego. Możesz również zaimplementować to za pomocą Perla, Pythona, C lub w jakimkolwiek innym języku, w którym czujesz się najlepiej.


Oto przykładowe dane wyjściowe:

B        renamed in index 
A        untracked 
dont_delete_git_pre-commit_hook untracked 

sobie sprawę, zakładki są wyświetlane jako przestrzenie. W skrypcie Awk print f " " stat; oraz w komendzie column -t -s " " między podwójnymi cudzysłowami znajduje się karta (bez spacji). Możesz użyć separatora innego niż tabulator.


Zauważyliśmy problem z obsługą flag statusu w powyższym skrypcie i jego poprawieniem.

+0

To nie pokaże "kontekstu" niezmienionych plików. Ale myślę, że mogę zacząć od tego, aby dodać wszystkie inne pliki. – berkes

+2

Skrypt ten pokaże ci status tego, co/może zostać popełnione. Wygląda na to, że wylistowanie niezmodyfikowanych śledzonych plików będzie wymagało trochę pracy; Nie mogę znaleźć szybkiego rozwiązania. –

-1

To powinno Ci zacząć:

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

Zobacz git help ls-files dla innych flag, które można wykorzystać.

Może chcesz używać powłoki wbudowane printf aby wyrównać wyświetlamy sposób mieć go w swoim przykładzie:

$ (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

Nie widzę, jak można użyć plików git ls do raportowania tylko zawartości katalogów; tj. nie wyświetlają wszystkich informacji rekursywnych – berkes

Powiązane problemy