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 命令/标志有更短的方法吗?
git grep --cached -l ''
Run Code Online (Sandbox Code Playgroud)
列出所有非空文件,不包括子模块和符号链接。
您可能还对为大规模重构排除二进制文件感兴趣:如何列出 git 存储库中的所有文本(非二进制)文件?
我强烈建议.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,并且它不是该行的最后一个内容,因此无法正确处理带有空格的文件名。