我们的存储库 (https://github.com/code-dot-org/code-dot-org) 最近已转换为使用 Git LFS。我们在 Git 中有大型静态 Web 目录,这无疑不是一个很好的模式。我们的方法是将这些大型目录包含在 LFS 中,然后排除其中某些“已知为文本”的文件类型。
以下是
.gitattributes
中这种方法的示例:
pegasus/sites.v3/** filter=lfs diff=lfs merge=lfs -text # include dir in LFS
pegasus/sites.v3/**/*.haml !text -filter -merge -diff # exclude *.haml from LFS
但是,
git diff
在排除情况下的表现并不符合预期,假设我修改了 pegasus/sites.v3/hourofcode.com/views/front_join_us.haml
。这是由 dir 模式包含的,但随后被更具体的文件扩展名模式排除,但是当尝试获取 git diff
时,它声称该文件是二进制文件并且不会比较它们:
diff --git a/pegasus/sites.v3/hourofcode.com/views/front_join_us.haml b/pegasus/sites.v3/hourofcode.com/views/front_join_us.haml
index aaf209c98be..2de745be618 100644
Binary files a/pegasus/sites.v3/hourofcode.com/views/front_join_us.haml and b/pegasus/sites.v3/hourofcode.com/views/front_join_us.haml differ
此外,它不会自动合并文件。神秘的是一些工具,比如 VSCode,可以正确地比较这个文件。
我已确认
front_join_us.haml
未被 LFS 跟踪:
git lfs ls-files | grep front_join_us.haml # returns nothing
更新:@LeGEC 建议使用
git check-attr -a -- <path>
检查文件的属性。结果是:
> git check-attr -a -- pegasus/sites.v3/hourofcode.com/views/front_join_us.haml
pegasus/sites.v3/hourofcode.com/views/front_join_us.haml: diff: unset
pegasus/sites.v3/hourofcode.com/views/front_join_us.haml: merge: unset
pegasus/sites.v3/hourofcode.com/views/front_join_us.haml: filter: unset
似乎由
git lfs import
生成的“从 LFS 中排除”gitattributes 模式实际上并未将文件返回到默认属性...我如何将过滤器、差异和合并返回到其默认值(因此 git check-attr 报告不属性)与现在未设置的比较?
您在评论中指出,您怀疑应用于文件的属性存在问题,要调试属性问题,您可以使用
git check-attr
:
git check-attr --all -- path/to/file
原来这样设置属性:
# .gitattributes:
pegasus/sites.v3/**/*.haml !text -filter -merge -diff # exclude *.haml from LFS
导致所有这些属性“未设置”:
$ git check-attr -a -- pegasus/sites.v3/hourofcode.com/views/front_join_us.haml
pegasus/sites.v3/hourofcode.com/views/front_join_us.haml: diff: unset
pegasus/sites.v3/hourofcode.com/views/front_join_us.haml: merge: unset
pegasus/sites.v3/hourofcode.com/views/front_join_us.haml: filter: unset
git help gitattributes
对于给定路径,每个属性都可以处于以下状态之一:
[...]
取消设置
该路径具有特殊值“false”的属性;这是通过在属性列表中列出以破折号为前缀的属性名称来指定的。
[...]
未指定
没有模式与路径匹配,也没有说明路径是否具有该属性,该路径的属性被称为“未指定”。
diff
标志“未设置”是导致缺少 diff 问题的原因。
将 gitattributes 规则更改为:
# .gitattributes: use '!' instead of '-'
pegasus/sites.v3/**/*.haml !text !filter !merge !diff # exclude *.haml from LFS
属性返回“未指定”并且差异返回。