用git状态信息增强“ls”?

时间:2012-01-04 12:38:38

标签: 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状态信息。

4 个答案:

答案 0 :(得分:11)

使用Git状态short format信息,这是一个使用Awk的Bash脚本和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 "  "

如果您在git-status-ls的目录中创建可执行文件PATH$HOME/bin应该是一个好地方),您可以在任何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 " "命令中,双引号之间有一个制表符(不是空格)。您可以使用tab以外的分隔符。


注意到上述脚本中状态标志处理的问题并进行了更正。

答案 1 :(得分:5)

k

具有git功能的zsh的目录列表

https://github.com/supercrabtree/k

enter image description here

答案 2 :(得分:2)

我想要这样的东西-只是用git的状态注释常规ls输出。我非常喜欢在另一个答案中提到的k命令,但这是zsh特有的。因此,我写了一个bash脚本,它可以放在我的库中,并且可以从我使用的任何shell中运行,并且可以修改ls的输出以添加git中的额外信息。

https://github.com/gerph/ls-with-git-status/

由于它修改了ls的输出,因此可以使用ls开关中的任何[1]来运行它,并且它将修改输出以包含git信息。它没有完全使用问题中要求的描述,但确实描述了文件,存储库和子模块的更改状态。

一个例子:

charles@laputa ~/projects/prm (add-ci-build-support)> lsg
Makefile                {ignored}
artifacts               {ignored}
build-to-junitxml.yaml  {untracked}
catalog
ci                      (replace-bash-junit-xml-processor↓4 19 forward) {1 modified}
ci-logs                 {ignored}
do-build.sh
index-makefile-ro.xsl
index-makefile.xsl
index.xml
index.xsl               {modified locally, 3 lines}
logs                    {ignored}
old-header              {untracked}
output                  {ignored}
project.config
src
test-results.xml        {untracked}
tmp                     {ignored}

在上面:

  • 有许多被忽略的文件({ignored}以灰色显示)
  • 有些未跟踪({untracked}显示为红色)
  • 一个文件已更改了三行({modified locally, 3 lines}以黄色显示,用于修改)
  • {}注释是关于文件或目录的。
  • ()的评论是关于存储库的。
  • 一个目录ci是一个存储库:
    • 当前为4的提交在分支replace-bash-junit-xml-processor的头后面(分支名称为青色,后面的更改数量为蓝色)
    • 比上次提交的时间早19个更改(19 forward呈黄色,表示修改)
    • 包含1个已修改的文件(1 modified为黄色,表示已修改)

git status中使用的git配置中读取颜色。

[1]一些开关没有意义-强制每个文件1行,并且不支持Dired模式或其他某些格式。

答案 3 :(得分:-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