用git状态信息增强"ls"?

ber*_*kes 24 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
Run Code Online (Sandbox Code Playgroud)

以任何方式:在目录列表中提供git状态信息.

Dan*_*ruz 11

使用Git状态短格式信息,这是一个使用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 "  "
Run Code Online (Sandbox Code Playgroud)

如果你git-status-ls在你的目录中创建一个可执行文件PATH($HOME/bin应该是一个好地方),你可以输入git status-ls任何Git仓库.或者你可以为此创建一个Git别名单行.您也可以使用Perl,Python,C或您最熟悉的任何语言来实现它.


这是一个示例输出:

B                                renamed in index
A                                untracked
dont_delete_git_pre-commit_hook  untracked
Run Code Online (Sandbox Code Playgroud)

刚刚意识到,标签显示为空格.在Awk脚本print f " " stat;column -t -s " "命令中,双引号之间有一个制表符(不是空格).您可以使用tab以外的分隔符.


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

  • 按原样,此脚本将告诉您将要/可能提交的内容的状态.看来列出未经修改的跟踪文件将需要一些工作; 我找不到快速解决方案. (2认同)

Ant*_*los 6

ķ

使用git功能的zsh目录列表

https://github.com/supercrabtree/k

在此输入图像描述


小智 6

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

\n\n

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

\n\n

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

\n\n

一个例子:

\n\n
charles@laputa ~/projects/prm (add-ci-build-support)> lsg\nMakefile                {ignored}\nartifacts               {ignored}\nbuild-to-junitxml.yaml  {untracked}\ncatalog\nci                      (replace-bash-junit-xml-processor\xe2\x86\x934 19 forward) {1 modified}\nci-logs                 {ignored}\ndo-build.sh\nindex-makefile-ro.xsl\nindex-makefile.xsl\nindex.xml\nindex.xsl               {modified locally, 3 lines}\nlogs                    {ignored}\nold-header              {untracked}\noutput                  {ignored}\nproject.config\nsrc\ntest-results.xml        {untracked}\ntmp                     {ignored}\n
Run Code Online (Sandbox Code Playgroud)\n\n

上文中:

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

颜色是从 .git 中使用的 git 配置中读取的git status

\n\n

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

\n