如何列出Git主仓库及递归子模块中相对主仓库的变更文件
需求:递归获取主仓库及嵌套子模块中所有变更文件的完整路径
假设仓库结构如下:
MainRepo file1 file2 directory1 file3 submodule1 fileA fileB submodule2 submodule3
其中file*由MainRepo跟踪,submodule1和submodule2是MainRepo的子模块,submodule3是submodule2的子模块。
主仓库与子模块各自拥有独立提交记录,MainRepo当前提交会对应submodule1和submodule2的特定提交,但子模块当前检出的提交可能和主仓库提交中记录的不一致。
我需要获取所有相对MainRepo路径的文件列表,要求:
- 这些文件的状态与
MainRepo当前提交中记录的状态不同 - 递归处理嵌套子模块,子模块文件的状态需要和主仓库提交对应的子模块提交状态对比
- 「状态不同」包含:文件被修改、删除,或新增(未追踪且未被忽略)的文件
示例场景与期望输出
主仓库处于提交aaabbb,该提交指向submodule1的提交aaa111,但当前submodule1处于提交aaa122(该提交修改了fileA,且之后fileA无未追踪变更);提交aaa122后,fileB被修改且未提交;同时主仓库的file1和directory1/file3也被编辑。此时期望得到的文件列表为:
MainRepo/file1 MainRepo/directory1/file3 MainRepo/submodule1/fileA MainRepo/submodule1/fileB
简单来说,该列表应包含所有与执行git clone --recurse-submodules MainRepo后得到的文件状态不同的文件路径。
现有命令的局限性
git diff --name-only SHA1 SHA2或git ls-files -om --exclude-standard无法满足需求,因为它们不会递归进入嵌套子模块。
内容的提问来源于stack exchange,提问作者SU3
相关产品推荐
相关产品推荐

