已加入.gitignore的带空格路径文件仍显示在工作区变更中如何解决?
我目前在处理一类路径带空格的文件,示例路径如下:
Site/Product Client/Modules/Product.Customer.Client.dll
(其中“Product”和“Customer”会被替换为对应名称)
在Git Extensions中右键该文件,选择添加到.gitignore后,文件依然显示在“工作区变更”里。另外自己写的一些glob风格规则也不生效,比如:
/Site/**/Product.*.dll (amongst others)
怀疑Git处理含空格的目录结构时存在问题。使用的Git Extensions版本是4.2.1.17611,底层Git版本为git version 2.45.1.windows.1(通过git version命令行查看)。
解决步骤:
先确认文件是否已被Git追踪
如果文件之前已经被添加到Git版本库,.gitignore规则不会生效。执行命令检查:git check-ignore -v Site/Product\ Client/Modules/Product.Customer.Client.dll如果没有输出,说明文件已被追踪,需要先移除追踪(不会删除本地文件):
git rm --cached "Site/Product Client/Modules/Product.Customer.Client.dll"提交这个变更后,再应用.gitignore规则。
修正.gitignore中的路径写法
Git的.gitignore用的是glob模式而非正则表达式,路径里的空格无需转义,直接保留即可。你可以把规则改成:/Site/**/Product.*.dll或者针对带空格目录的精确写法:
/Site/Product Client/**/*.dll注:
**匹配任意层级目录,*匹配任意非路径分隔符的字符。检查Git Extensions生成的规则
Git Extensions可能因空格处理逻辑生成错误规则,直接打开项目根目录的.gitignore文件,手动修正规则,确保路径中的空格完整保留,没有被错误转义或截断。刷新Git缓存
缓存可能导致规则不生效,执行命令刷新:git update-index --refresh之后再查看工作区变更,被忽略的文件应该就不会显示了。
验证规则有效性
用git check-ignore测试规则是否生效:git check-ignore -v "Site/Product Client/Modules/Product.Customer.Client.dll"如果输出对应的.gitignore规则行,说明规则已经生效。
内容的提问来源于stack exchange,提问作者Dominique

