2012-01-04 29 views
21

Có một lệnh hiện tại hoặc một số thủ thuật hoặc tập lệnh cho phép tôi hiển thị trạng thái của các tệp được hiển thị trong "ls" không?Tăng cường "ls" với thông tin trạng thái git?

Something như sau:

$ 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 

Bằng cách nào: có thông tin trạng thái git sẵn trong một danh sách thư mục.

+5

Những gì bạn sẽ tranh luận là lợi ích của định dạng này trên 'git status'? – Nate

+1

@Nate: Nó cung cấp một birdseye tốt hơn, IMO. Đặc biệt hữu ích nếu nhiều tệp đã bị thay đổi. Nhưng cũng để xem những thay đổi trong bối cảnh của toàn bộ danh sách dir là hữu ích. – berkes

+1

Gần nhất có thể là 'git status -s', nhưng nó sẽ không báo cáo bất cứ điều gì khác ngoài sửa đổi – fge

Trả lời

10

Sử dụng trạng thái Git short format thông tin, đây là tập lệnh Bash sử dụng lệnh Awk và lệnh column để cung cấp cho bạn đầu ra trạng thái tùy chỉnh.

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

Nếu bạn tạo một thực thi git-status-ls trong một thư mục trên PATH ($HOME/bin phải là một nơi tốt), bạn có thể gõ git status-ls trong bất kỳ repo Git. Hoặc bạn có thể tạo một bí danh Git một lớp lót cho việc này. Bạn cũng có thể thực hiện điều này bằng Perl, Python, C hoặc bất kỳ ngôn ngữ nào bạn cảm thấy thoải mái nhất.


Dưới đây là một đầu ra mẫu:

B        renamed in index 
A        untracked 
dont_delete_git_pre-commit_hook untracked 

Chỉ cần nhận ra, tab được hiển thị như không gian. Trong tập lệnh Awk print f " " stat; và trong lệnh column -t -s " ", có một tab (không phải dấu cách) giữa dấu ngoặc kép. Bạn có thể sử dụng dấu tách khác với tab.


Nhận thấy có vấn đề với cờ trạng thái được xử lý trong tập lệnh ở trên và đã sửa nó.

+0

Điều này sẽ không hiển thị "ngữ cảnh" của các tập tin không thay đổi. Nhưng tôi đoán tôi có thể bắt đầu với điều này để thêm tất cả các tập tin khác quá. – berkes

+2

Như vậy, tập lệnh này sẽ chỉ cho bạn biết trạng thái của những gì sẽ/có thể được cam kết. Dường như danh sách các tệp được theo dõi chưa được sửa đổi sẽ yêu cầu một chút công việc; Tôi không thể tìm ra giải pháp nhanh. –

-1

Điều này sẽ giúp bạn bắt đầu:

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

Xem git help ls-files cho cờ khác mà bạn có thể sử dụng.

Bạn có thể muốn sử dụng vỏ của bạn được xây dựng trong printf để gắn kết đầu ra theo cách bạn có nó trong ví dụ của bạn:

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

Tôi không thấy cách git ls-files có thể được sử dụng để báo cáo chỉ trên nội dung thư mục; tức là không hiển thị tất cả thông tin đệ quy – berkes

Các vấn đề liên quan