git ls-files
还列出了子模块。
使用:List submodules in a git repository和How 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命令/标志是否有更短的方法?
答案 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上进行了测试。