TortoiseGit 图标覆盖不显示问题排查总结一、问题现象二、第一步确认 Git 仓库本身是否正常三、第二步确认 TortoiseGit 是否能识别文件状态四、第三步检查 TortoiseGit 图标覆盖设置五、第四步检查注册表排序六、第五步确认不是 Windows Blocked 禁用问题七、第六步检查 Shell Extensions\Approved八、第七步关键排查——检查 CLSID 实际指向九、真正的问题原因十、用 PowerShell 批量检查所有 overlay 项一、问题现象Windows 安装 TortoiseGit 后在 Git 仓库目录中资源管理器中不显示绿色正常图标红色修改图标蓝色问号图标但是右键菜单和 TortoiseGit 功能基本正常。二、第一步确认 Git 仓库本身是否正常首先进入仓库目录执行:cd/d xxx(Git 仓库目录)gitstatus结果显示modified: 1xxxx.m(修改的文件名)Untracked files: 2xxxx.m新增的文件名 xxxx.txt说明Git 仓库正常文件确实有修改不是 git status 识别失败三、第二步确认 TortoiseGit 是否能识别文件状态打开右键仓库空白处 → TortoiseGit → Check for Modifications结果 TortoiseGit 能看到Modified Files:1xxxx.mNot Versioned Files:2xxxx.m…说明TortoiseGit 本身能正确识别仓库状态不是 TortoiseGit 判断状态失败所以问题缩小为Windows Explorer 没有正确显示 overlay 图标四、第三步检查 TortoiseGit 图标覆盖设置进入TortoiseGit 设置 → 图标覆盖检查并修改状态缓存默认磁盘驱动器类型勾选本地硬盘排除路径为空包含路径可以为空同时勾选如果文件夹包含未版本控制的文件标识父文件夹为已修改然后重启缓存和资源管理器taskkill /f /im TGitCache.exe taskkill /f /im explorer.exe start explorer.exe但此时仍然不显示图标说明问题不是简单的 TortoiseGit 设置问题。五、第四步检查注册表排序打开注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers发现Tortoise1NormalTortoise2ModifiedTortoise3Conflict…确实已经排在前面。一开始容易误判为Tortoise 排在前面所以注册表没问题但后来发现这是不够的。不能只看左侧名称排序还必须看右侧 CLSID 实际指向谁。六、第五步确认不是 Windows Blocked 禁用问题检查HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked发现没有 Blocked 项。说明Windows 没有显式阻止 TortoiseGit shell extension这个方向排除。七、第六步检查 Shell Extensions\Approved进入HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved里面可以看到TortoiseGit - NormalTortoiseGit - ModifiedTortoiseGit - AddedTortoiseGit - DeletedTortoiseGit - Unversioned…说明TortoiseGit shell extension 是注册过的不是完全没有注册八、第七步关键排查——检查 CLSID 实际指向我们用这个命令检查 Tortoise2Modified 的 GUIDreg queryHKCR\CLSID\{5AB7172C-9C11-405C-8DD5-AF20F3606282}\InprocServer32结果竟然是C:\Program Files\Microsoft OneDrive\...\FileSyncShell64.dll这就发现了根本问题虽然注册表左侧名称叫 Tortoise2Modified但它右侧 GUID 实际对应的是 OneDrive 的 overlay handler。也就是说Tortoise 的名字下面挂了 OneDrive 的 CLSIDExplorer 加载时并不看“名字像不像 Tortoise”它实际加载的是 CLSID 对应的 DLL。所以它加载到的是 OneDrive 的 FileSyncShell64.dll当然不会显示 Git 的红绿图标。九、真正的问题原因根本原因是ShellIconOverlayIdentifiers 中的 overlay 项被错误修改过导致 TortoiseGit 的 overlay 名称和 OneDrive 的 CLSID 发生错配。具体表现为Tortoise2Modified → OneDrive FileSyncShell64.dll而正确状态应该是Tortoise2Modified → TortoiseOverlays.dll十、用 PowerShell 批量检查所有 overlay 项为了避免一个个手动点注册表可以用 PowerShell 一次性列出所有 overlay 项的实际 DLL 指向$basePathSOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers$base[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey($basePath)$i 0foreach($namein$base.GetSubKeyNames()){$i$sub$base.OpenSubKey($name)$guid$sub.GetValue()$dllKey[Microsoft.Win32.Registry]::ClassesRoot.OpenSubKey(CLSID\$guid\InprocServer32)$dllif($dllKey){$dllKey.GetValue()}else{CLSID missing}if($dll-matchTortoiseGit|TortoiseOverlays){$ownerTORTOISE}elseif($dll-matchOneDrive|FileSyncShell){$ownerONEDRIVE}elseif($dll-matchWorkspace|WPS|BaiduNetdisk){$ownerWPS/WORKSPACE}else{$ownerOTHER}{0,2}. [{1}] {2} {3} {4}-f$i,$name,$guid,$owner,$dll}这个脚本的作用是显示 overlay 名称显示对应 GUID显示实际属于 Tortoise / OneDrive / 其他软件显示实际 DLL 路径这样就能判断名称是 Tortoise但实际指向 OneDrive → 错误名称是 OneDrive但实际指向 OneDrive → 正常名称是 Tortoise实际指向 TortoiseOverlays.dll → 正常十一、修改后的正确结果修改后 PowerShell 输出显示Tortoise1NormalTORTOISEC:\Program Files\Common Files\TortoiseOverlays\TortoiseOverlays.dll Tortoise2ModifiedTORTOISEC:\Program Files\Common Files\TortoiseOverlays\TortoiseOverlays.dll Tortoise3ConflictTORTOISEC:\Program Files\Common Files\TortoiseOverlays\TortoiseOverlays.dll... Tortoise9UnversionedTORTOISEC:\Program Files\Common Files\TortoiseOverlays\TortoiseOverlays.dllOneDrive 项显示为OneDrive1ONEDRIVEC:\Program Files\Microsoft OneDrive\...\FileSyncShell64.dll OneDrive2ONEDRIVEC:\Program Files\Microsoft OneDrive\...\FileSyncShell64.dll... OneDrive7ONEDRIVEC:\Program Files\Microsoft OneDrive\...\FileSyncShell64.dll这说明Tortoise 项已经恢复为 Tortoise 的内容OneDrive 项也恢复为 OneDrive 的内容到这里注册表修复基本成功。