Git切换分支报错:目录转为子模块后文件被判定为未跟踪
Git切换分支时未跟踪文件冲突的原因与解决办法
问题根源
- 子模块转换后的索引不同步:在
mybranch中将Sdir转为子模块S的提交里,虽然删除了a、b、c,但频繁的rebase操作可能导致主仓库R的索引(index)没有正确同步更新。子模块S的本地仓库里a、b、c是被跟踪的,但主仓库R的索引仍残留着旧的文件记录,导致Git误判a、b为未跟踪文件。 - 主仓库与子模块的状态分离:
cd Sdir; git ls-files -t查看的是子模块自身的仓库状态,和主仓库R的索引是独立的。主仓库R的索引没有识别到Sdir已经变成子模块,仍将a、b视为普通文件,而oldbranch中Sdir是普通目录且包含这两个文件,切换时就会触发覆盖冲突。
解决步骤
- 步骤1:同步子模块状态
进入子模块目录,确保其状态干净:cd Sdir git stash # 暂存未提交的修改(如果有) git checkout <对应分支> # 切换到子模块的正确分支,确保a、b、c正常跟踪 - 步骤2:修正主仓库索引
返回主仓库根目录,强制将a、b从主仓库索引中移除:cd .. git rm --cached Sdir/a Sdir/b - 步骤3:验证并切换分支
检查主仓库状态,确认a、b不再显示为未跟踪文件:
之后尝试切换分支:git statusgit checkout oldbranch - 备选方案(若上述步骤无效)
备份Sdir/a和Sdir/b后,直接删除本地工作区的这两个文件,再切换分支:cp Sdir/a Sdir/b ~/backup/ rm Sdir/a Sdir/b git checkout oldbranch
内容的提问来源于stack exchange,提问作者Lutz Prechelt
相关产品推荐
相关产品推荐

