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

Cir*_*四事件 7 git bash

git ls-files
Run Code Online (Sandbox Code Playgroud)

还列出了子模块。

使用:列出 git 存储库中的子模块以及如何从另一个文件 A 中删除出现在文件 B 上的行?我可以:

git ls-files | grep -Fxvf <(git submodule status | cut -d' ' -f3)
Run Code Online (Sandbox Code Playgroud)

或更详细和通用的:

git ls-files | while IFS='' read -r file; do
  if [ -f "$file" ]; then
    echo "$file"
  fi
done
Run Code Online (Sandbox Code Playgroud)

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

Cir*_*四事件 6

git grep --cached -l ''
Run Code Online (Sandbox Code Playgroud)

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

您可能还对为大规模重构排除二进制文件感兴趣:如何列出 git 存储库中的所有文本(非二进制)文件?

使用此测试仓库在 Git 2.16.1 上进行了测试


jst*_*ine 3

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

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

或者,只要设计正则表达式,就可以直接解析该文件,使其不会与通过以下方式推荐的子模块匹配#

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

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

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

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