Git无法清除工作区未跟踪变更 残留已删除/未跟踪文件
问题根因
这个问题和你有没有开GUI客户端、IDE没关系,核心原因是develop分支的提交历史里被存入了一个带非法文件名字符(半角冒号:)的无效文件:
- Git索引中记录的该文件完整路径为
src/use_cases/aggregator/update_stores_status_use_case.py~other: (UseCase) Refactor naming,半角冒号是Windows NTFS、macOS APFS文件系统的保留字符,不允许出现在文件名中,只有Linux的ext4等文件系统支持这类命名 - 你切换到develop分支时,操作系统根本无法创建这个带冒号的文件,只会自动截断文件名,生成残缺的
src/use_cases/aggregator/update_stores_status_use_case.py~other文件,也就是你看到的??状态未跟踪文件 - Git检测到索引里登记的长文件名文件在工作区不存在,就会一直显示
D(已删除)的变更标记。你之前执行的git clean/git reset/git checkout要么只能删掉截断生成的残缺文件,要么因为无法匹配/恢复系统根本不支持创建的非法文件名文件,没法消除这个删除记录。哪怕删了仓库重克隆,只要切到develop分支拉到这个带非法文件的提交,问题就会复现。这类带~后缀的文件基本都是编辑器自动生成的临时备份,本来就不该提交进版本库。
解决步骤
按照下面的顺序操作,一次就能清干净,而且能彻底避免后续复现:
- 先清理工作区的残缺临时文件
执行强制清理命令删掉系统自动生成的截断文件:
如果命令执行完文件还在,直接打开对应目录手动删除git clean -f src/use_cases/aggregator/update_stores_status_use_case.py~other即可。 - 移除Git索引里的非法文件记录
这一步是消除顽固D标记的核心,直接从Git索引中删除这个系统无法正常识别的无效条目即可,注意文件名要和git status里显示的D状态的文件名完全一致,用双引号包裹避免特殊字符转义问题:
如果执行时提示路径不匹配,先跑下面的命令列出索引中该目录下的所有真实登记文件,复制输出结果里的完整长文件名再执行删除:git rm --cached "src/use_cases/aggregator/update_stores_status_use_case.py~other: (UseCase) Refactor naming"git ls-files src/use_cases/aggregator/ - 提交修正到远程,彻底解决问题
这个非法文件是存在于远程develop分支的提交里的,只在本地删除索引的话,下次拉取代码还是会复现,直接提交修正推到远程即可:git commit -m "chore: remove invalid backup file with illegal filename" git push origin develop
后续预防
你可以在仓库根目录的.gitignore文件里加一行规则,全局忽略这类临时备份文件,避免以后再出现误提交:
# 忽略编辑器生成的~后缀备份文件 *~
内容的提问来源于stack exchange,提问作者J. García
相关产品推荐
相关产品推荐

