列出状态为 git 的文件

list files with git status

背景

我很清楚 git status 的工作原理,甚至 git ls-files。通常 git status 是我所需要和想要的,它完美地回答了这个问题:“我的状态是什么,我需要注意哪些文件?”

但是,我一直无法找到回答以下问题的快速命令:“我有哪些文件,它们各自的状态是什么?”因此,我需要目录的完整列表(如 ls -la),其中有一列显示每个 file/directory.

的状态

我试过的

git status -s --ignored 非常接近我想要的输出格式,但它不会列出 HEAD、索引和工作目录之间未更改的文件。此外,它将递归到目录中。

git ls-files 似乎能够以脚本形式提供所有必需的信息,但我无法阻止它递归列出所有目录的内容。

显然,我可以破解一些东西来获取这两个命令的输出并提供我想要的视图。但是,如果那里已经有一些可用的命令,我不想重新发明轮子。


问题

是否有某种方法可以列出目录中的所有文件及其各自的 git 状态?
我想要一个显示与 ls 完全相同的文件的完整列表。


备注

This other question 没有回答我的问题,因为我绝对想要一个 ls 等价物。包括未修改、忽略和未跟踪的文件,但不包括目录内容。

因为git status -s的输出已经足够了,我们就围绕这个函数做一个bash例程吧!然后对于未更改的文件,我们可以 手动回显 正确的信号。在 specification 之后,我们可能会使用 space 的两个符号 ' ' 为此目的或者其他一些符号。例如。对于 Git 未跟踪的目录,选择符号“_”作为状态代码:

for FILE in *
do
  if [[ -f $FILE ]]
  then
    if ! [[ $(git status -s $FILE) ]]
    then
      # first two simbols below is a two-letter status code 
      echo "   $FILE"
    else 
      git status -s "$FILE"
    fi
  fi
  if [[ -d $FILE ]]
  then
    # first two symbols just selected as status code for directories
    echo "__ $FILE"
  fi
done

该脚本的工作方式与 ls 相同。也可以用;写成一行

要限制路径 Git 检查到当前目录,请使用它的 Unix glob pathspecs。由于 git status 对索引和 HEAD 做了很多检查,使用它,并填写其余文件 ls 会告诉你,使用 ls,只需 munge 它的输出与 git status 的输出具有相同的格式,并且只采用 git status 尚未列出的格式。

( git status -s -- ':(glob)*'; ls -A --file-type | awk '{print "   "[=10=]}' ) \
| sort -t$'\n' -usk1.4

:(glob) 告诉 Git pathspec 的其余部分是一个 Unix glob,即 * 应该只匹配一个级别,就像(启用 dotglob)shell 通配符¹.

-t$'\n'告诉sort字段分隔符是换行符,即都是一个大字段,-usk1.4uniquify,只取第一个运行、stable 的,在不违反排序键顺序的情况下保留输入顺序(这有点慢,所以你必须专门要求),k1.4 表示密钥从第一个字段开始,该字段中的第四个字符,没有给出从那里到最后的结尾。


¹ 为什么他们决定让路径规范在默认情况下既不匹配 shell 规范也不匹配 gitignore 规范,我可能永远不会费心去学习,因为我更喜欢无知地反对他们恼人的选择.