Git父模块执行git status未显示子模块新增提交问题排查
核心原因排查方向
子模块忽略配置开启
这是最高发的原因:父仓库的Git配置中可能开启了子模块忽略规则,导致状态检测跳过子模块的版本变更。
排查命令:git config --list | grep -i submodule.*ignore如果返回结果包含
submodule.Submodule.ignore=all、submodule.Submodule.ignore=dirty或者diff.ignoreSubmodules=all,说明规则生效:ignore=all会完全忽略子模块所有变更,diff.ignoreSubmodules=all会全局屏蔽所有子模块的变更检测,都会出现你遇到的情况。
解决方法:移除对应忽略配置即可# 移除当前仓库的对应忽略规则 git config --unset submodule.Submodule.ignore git config --unset diff.ignoreSubmodules # 如果是全局配置生效,加--global参数移除 git config --unset --global submodule.Submodule.ignore git config --unset --global diff.ignoreSubmodules子模块路径被加入忽略规则
不要仅检查.git/info/exclude,需要排查所有层级的忽略规则:父仓库根目录.gitignore、全局Git忽略配置。
快速排查命令:git check-ignore -v Submodule如果有输出内容,就说明子模块路径被某条忽略规则匹配,找到对应规则删除即可。
Windows大小写不敏感导致路径不匹配
Windows系统默认文件名大小写不敏感,如果子模块本地文件夹的大小写和父仓库中记录的路径大小写不一致,Git会无法识别变更。
排查方法:对比git ls-tree HEAD Submodule输出的路径名和本地实际子模块文件夹名的大小写,不一致的话将本地文件夹名修改为和仓库记录完全一致即可。git commit -a本身不暂存子模块版本变更
Git的git commit -a仅会暂存已经跟踪的普通文件的修改,子模块的版本指针(gitlink)变更属于特殊记录,即便Git状态检测到了变更,也需要手动执行git add Submodule后再提交,commit -a不会自动处理这类变更。
内容的提问来源于stack exchange,提问作者Joseph

