2012-01-04 25 views
21

有沒有現有的命令,或者是一些讓我顯示「ls」中顯示的文件狀態的技巧或腳本?使用git狀態信息增強了「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

你會認爲這是格式通過'混帳status'的好處? – Nate 2012-01-04 12:42:33

+1

@Nate:它提供了一個更好的birdseye,IMO。如果許多文件被改變,特別有用。但也要看到整個目錄列表的變化是有用的。 – berkes 2012-01-04 12:52:01

+1

最接近的可能是'git status -s',但它不會報告除修改以外的其他內容 – fge 2012-01-04 13:09:23

回答

10

使用Git狀態short format信息,這是一個Bash腳本,它使用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。或者你可以爲此創建一個Git別名。你也可以使用Perl,Python,C或任何你最喜歡的語言來實現它。


下面是一個示例輸出:

B        renamed in index 
A        untracked 
dont_delete_git_pre-commit_hook untracked 

剛剛意識到,選項卡顯示爲空格。在Awk腳本print f " " stat;column -t -s " "命令中,雙引號之間有一個製表符(不是空格)。您可以使用標籤以外的分隔符。


注意到上述腳本中的狀態標誌處理問題並進行了更正。

+0

這不會顯示未更改文件的「上下文」。但我想我可以從這開始添加所有其他文件。 – berkes 2012-01-04 17:51:44

+2

就像這樣,這個腳本會告訴你什麼會/可能被提交的狀態。這似乎列出未修改的跟蹤文件將需要一點工作;我找不到一個快速解決方案。 – 2012-01-04 21:02:17

-1

這應該讓你開始:

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

的,你可以用其他標誌見git help ls-files

你可能想使用你的shell內建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 2012-01-04 17:53:23