`git diff`不适用于从 Git LFS 中排除的文件

问题描述 投票:0回答:1

我们的存储库 (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 git-lfs
1个回答
0
投票

您在评论中指出,您怀疑应用于文件的属性存在问题,要调试属性问题,您可以使用

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

属性返回“未指定”并且差异返回。

© www.soinside.com 2019 - 2024. All rights reserved.