gitattributes中是否必须使用Git大型文件存储(LFS)的filter属性



当我使用具有以下模式*.png binary.gitattributes文件来处理带有Git LFS的大型PNG文件时,什么都没有发生,LFS被忽略
当我用git lfs track '*.png'手动设置轨迹模式时,我在.gitattributes文件中得到以下行:
'*.png' filter=lfs diff=lfs merge=lfs -text
这很好。

那么最近Git或Git LFS的更新中是否有更改,强制使用filter属性
或者这种模式是错误的?我猜这仍然很好,因为像这个存储库这样的突出资源使用它


其他信息:
通过研究和测试,我发现diffmerge属性目前只是LFS的占位符,如果我删除它们也没有什么区别,但删除filter属性会再次破坏LFS(没有错误-文件只是添加到存储库中,就好像没有文件类型的模式一样)。

这对我来说没有意义,因为过滤器是在运行git lfs install之后通过全局GIT配置强制执行的(如果我理解正确的话)。这里是.gitconfig:的相关部分

[filter "lfs"]
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
process = git-lfs filter-process
required = true

Btw。似乎.gitattributes中的模式是否被引用('*.png' filter=lfs -text)也无关紧要(*.png filter=lfs -text),这是正确的吗?


git lfs/2.10.0(GitHub;windows amd64;go 1.12.7;git a526ba6b)
git版本2.26.2

在命令行和Sourcetree上进行了测试
Bitbucket的存储库

。。。Git或Git LFS最近的更新是否有变化,强制使用filter属性?

否:始终是强制性的1原因是Git LFS的工作方式是,它使用污迹和干净过滤器将Git存储为存储库中的内容,该文件包含有关如何检索另一个文件的信息,而该文件根本不存储在Git中。另一个文件存储在某个服务器上——这不需要与你的Git服务器相同——并由smout过滤器从那里检索。存储在另一台服务器上的文件由clean过滤器更新(好吧,增强)为一个新文件2

Btw。似乎.gitattributes中的模式是否被引用('*.png' filter=lfs -text)也无关紧要(*.png filter=lfs -text),这是正确的吗?

是。如果文件名本身有空格,则只需要引号。但是,引号必须是引号,而不是单引号:"*.png"

(请注意,Git对污点和干净过滤器的处理有点奇怪:驱动程序的定义在.gitconfig.git/config文件上,因此可以是全局的或每个存储库,但对驱动程序


1有人可以,也可能已经,构建了一个前端命令来向您隐藏这一点,但如上所述,它仍然是必需的。

2更详细地说:当你签出commitH(一些哈希ID)时,Git实际上不是一个,而是三个

"活动的";每个文件的副本:

  • 其中一个副本一直处于冻结状态,并且处于当前提交中,即提交H。不管怎样,这个副本或者它的内容;模式和文件名是单独存储的——是一种特殊的、只读的、仅限Git的格式,并针对其他Git提交中的相同副本进行重复数据消除。

    Git调用这些冻结格式的内容对象blob对象。你通常不会直接与他们打交道。

  • 第二个副本是另一个已消除重复的blob对象——冻结格式的内容——但因为它存储在Git的索引中,所以可以随时替换。

  • 文件的最后一个副本在工作树中,是一个普通的日常文件。它不是压缩的,也不是只有Git才能读取而没有人可以写入的特殊格式:它是一个普通的日常文件。

通常,最后一个文件是通过复制和解压缩内部blob对象来创建的。如果你为一个文件设置了污迹过滤器,那么Git不是自己进行解压缩,而是解压缩文件,然后通过污迹过滤器运行内容。LFS污点过滤器读取内容,然后调用LFS服务器并说";这是查找键:给我真实的内容"。LFS污迹过滤器将检索到的文件写入到您的工作树中。

通常,git addfile的工作方式是将给定文件复制并压缩到内部blob对象中,然后将其写入索引。不过,如果你为文件设置了干净过滤器,Git不会直接读取文件:它会读取污迹过滤器并编辑文件。LFS污迹过滤器";编辑";读取数据并将其存储在LFS服务器上,然后生成一个新的查找关键字。

因此,当您有LFS过滤器时,Git看到的唯一数据就是LFS服务器查找键。

.gitattributes和/或.git/info/attributes中设置了要为哪些文件使用的污迹和清洁过滤器的选择。为给定的污迹或干净过滤器运行的程序是在Git配置文件中设置的,例如使用git configgit config --globalgit config --system

最新更新