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

8

2
可能不会,因为这些子模块在您的父Git存储库中具有树形条目。 git ls-files 显示它们似乎是完全合理的。我鼓励您考虑为 git ls-files 实现一个 --no-submodules 标志,并将补丁提交给 git;他们可能会接受它。 - larsks
3个回答

9

4

git ls-files命令有一个-s选项,可以直接从索引中列出已暂存文件的模式位和其他状态指示符,您可以测试这些指示符。

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

3
我强烈建议直接解析 .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 分隔,且它不是行中的最后一项,因此无法正确处理包含空格的文件名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接