Git LFS排除指定文件后git diff失效的技术求助
解决Git LFS排除规则后文件属性未恢复默认的问题
问题背景
我们仓库近期切换到Git LFS管理大型静态Web目录,在.gitattributes里设置了如下规则:先将目标目录整体纳入LFS,再排除其中的.haml文本文件:
pegasus/sites.v3/** filter=lfs diff=lfs merge=lfs -text # 把目录纳入LFS pegasus/sites.v3/**/*.haml !text -filter -merge -diff # 排除*.haml文件
但实际操作中发现:修改.haml文件时,git diff会误判为二进制文件无法生成差异,也无法自动合并。虽然git lfs ls-files | grep front_join_us.haml确认文件未被LFS追踪,但用git check-attr查看属性时,结果显示diff/merge/filter均为unset状态,而非预期的默认无属性状态。
解决方案
问题出在-filter这类写法会将属性标记为unset,而非真正恢复默认。需要修改.gitattributes的排除规则,用空值赋值覆盖之前的LFS属性,同时显式标记文件为文本类型:
pegasus/sites.v3/** filter=lfs diff=lfs merge=lfs -text # 把目录纳入LFS pegasus/sites.v3/**/*.haml text filter= diff= merge= # 恢复默认属性并标记为文本
text:强制标记文件为文本类型,解决Git误判二进制的问题filter=/diff=/merge=:用空值清除之前的LFS规则,让Git使用默认处理逻辑,此时git check-attr不会再输出这些属性
验证操作
修改完.gitattributes后,执行以下命令确认属性恢复:
git check-attr -a -- pegasus/sites.v3/hourofcode.com/views/front_join_us.haml
正常输出应仅显示text: set,其他属性不再出现。之后再运行git diff就能正常生成文本差异,自动合并功能也会恢复正常。
内容的提问来源于stack exchange,提问作者Seth
相关产品推荐
相关产品推荐

