git ls-files -根据文件的.gitattributes查询文件的未记录语法- git ls-files ':(attr:filter=lfs)'

9udxz4iz  于 2023-08-01  发布在  Git
关注(0)|答案(3)|浏览(108)

Is comparing git lfs ls-files with git ls-files ':(attr:filter=lfs)' a reliable way to detect lfs files that are not managed by lfs?使用git ls-files语法,根据文件的.gitattributes查询文件(在特定情况下,使用filter=lfs)

git ls-files ':(attr:filter=lfs)'

字符串
问题是,虽然它实际上没有问题,但它不是文档中解释的东西-https://git-scm.com/docs/git-ls-files
那么,这是我在文档中遗漏的东西,还是一些未记录的功能?

oknwwptz

oknwwptz1#

它在gitglossary上有记录:
attr:之后是一个空格分隔的“属性要求”列表,所有这些要求都必须满足才能将路径视为匹配;这是对通常的非魔术路径规范模式匹配的补充。

wfsdck30

wfsdck302#

事实上,它是有文档记录的,但不是你所期望的,甚至可能不是你所期望的。在the gitglossary中,在pathspec的定义下记录了这一点:
以冒号:开头的pathspec有特殊的含义...
attr:之后是一个空格分隔的“属性要求”列表,所有这些要求都必须满足才能将路径视为匹配;...

vhmi4jdf

vhmi4jdf3#

您可以在“git ls-files '(attr:X)D/'“(man)"的修复中找到其他信息和示例:当它触发公共前缀优化代码路径时,它无法从“D/.gitattributes”读取,这已经在Git 2.42(Q3 2023)中得到纠正。
参见commit f4a8fde(2023年7月8日)和commit 7e360bc(2023年7月7日)by Junio C Hamano ( gitster )
(由Junio C Hamano -- gitster --合并于commit 13ed10e,2023年7月17日)

dir:匹配“attr“pathspec魔术与正确的路径

报告人:马修·休斯
match_pathspec_item()函数接受“prefix“值,允许调用者从路径中去掉pathspec模式字符串的公共前导前缀,只使用路径的剩余部分来匹配pathspec模式(当然,在去掉相同的前导前缀之后)。
这种“公共前导前缀”优化具有两个主要特征:

  • 丢弃所述核内索引中在所述公共前导前缀之外的条目;如果你正在执行“ls-files one/a one/b“,我们知道所有匹配项必须来自“one/“,所以首先代码从内核索引中丢弃“one/“目录之外的所有条目。

这使我们能够在较小的数据集上工作。

  • 允许在匹配pathspec和path时跳过前导字节的比较。

当“ls-files“在给定“one/a“和“one/b“作为路径规范的核内索引中找到路径“one/a/1“时,知道找到了公共前导前缀“one/“可以让路径规范匹配器不必费心比较“one/“部分,并允许它向下馈送“a/1“。只要pathspec元素“one/a”得到对“a”的相应调整即可。
但是,当“attr”路径规范魔法生效时,当前代码就会崩溃。
除了内置的属性和来自$GIT_DIR/info/attributes文件和顶级.gitattributes文件的属性之外,当我们遇到每个路径并询问它是否匹配pathspec时,这些属性是从文件系统中按需读取的。
例如,如果您在一个仓库中说“git ls-files (attr:label)sub/”(man),文件“sub/file”在“sub/.gitattributes”中被赋予了“label”属性:

  • 公共前缀优化发现“sub/”是公共前缀,并修剪核心索引,使其仅具有该目录内的条目。

这是可取的。

  • 然后代码遍历内核索引,找到“sub/file”,并最终询问do_match_pathspec()是否与给定的路径规范匹配。
  • do_match_pathspec()在 * 从路径中剥离公共前缀“sub/”之后调用match_pathspec_item() *,赋予它“file”,加上公共前缀的长度(4字节),因此pathspec元素“(attr:label)sub/”可以被视为“(attr:label)”。

最后一个是破坏当前代码中匹配的原因,因为pathspec子系统最终要求属性子系统查找附加到路径“file“的属性。
调用match_pathspec_attrs()时需要询问sub/file上的属性;这可以通过查看“name”开始之前的“prefix”字节来完成,这是同一match_pathspec_item()函数中的另一段代码已经使用的相同技巧。
不幸的是,到目前为止还没有发现这一点,因为代码使用的参数略有不同,例如。

$ git ls-files "(attr:label)sub" 
$ git ls-files "(attr:label)sub/" "no/such/dir/"

字符串
将“sub/file”报告为具有“label”属性的路径,因为两者都不会触发公共前缀优化。

相关问题