如何列出Git跟踪的所有文件(不包括子模块)?

时间:2016-10-20 22:40:12

标签: git bash

git ls-files

还列出了子模块。

使用:List submodules in a git repositoryHow to remove the lines which appear on file B from another file A?我可以:

git ls-files | grep -Fxvf <(git submodule status | cut -d' ' -f3)

或者更详细和多才多艺:

git ls-files | while IFS='' read -r file; do
  if [ -f "$file" ]; then
    echo "$file"
  fi
done

使用一些git命令/标志是否有更短的方法?

3 个答案:

答案 0 :(得分:2)

git ls-files具有-s选项,可以直接从索引中列出暂存文件的模式位和其他状态指示器,您可以对其进行测试

git ls-files -s | grep -v ^16 | cut -f2-

答案 1 :(得分:1)

我强烈建议直接解析.gitmodules文件通常比git submodule status更安全且更快。可以使用git config解析此文件,以确保正确处理所有解析边缘情况 - 格式化,空格,注释等:

git ls-files | grep -Fxvf  <(git config --file .gitmodules --name-only --get-regexp path | cut -d '.' -f2-)

或者,只要正则表达式被设计为不匹配通过#推荐出来的子模块,就可以直接解析文件:

git ls-files | grep -Fxvf  <(grep "^\s*\[submodule " .gitmodules | cut -d '"' -f2)

请注意,git submodule status的输出格式很难通过cut正确解析。两个主要缺点是:

  • 文件名字段将根据模块是否初始化而改变

  • 文件名不是由\t标签分隔的,并且它不是该行的最后一件事,因此无法正确处理带空格的文件名。

答案 2 :(得分:1)

git grep --cached -l ''

列出所有非空文件,不包括子模块和符号链接。

您可能还希望排除二进制文件以进行批量重构:How to list all text (non-binary) files in a git repository?

使用this test repo在Git 2.16.1上进行了测试。