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
那么,这是我在文档中遗漏的东西,还是一些未记录的功能?
3条答案
按热度按时间oknwwptz1#
它在gitglossary上有记录:
在
attr:
之后是一个空格分隔的“属性要求”列表,所有这些要求都必须满足才能将路径视为匹配;这是对通常的非魔术路径规范模式匹配的补充。wfsdck302#
事实上,它是有文档记录的,但不是你所期望的,甚至可能不是你所期望的。在the gitglossary中,在pathspec的定义下记录了这一点:
以冒号
:
开头的pathspec有特殊的含义...在
attr:
之后是一个空格分隔的“属性要求”列表,所有这些要求都必须满足才能将路径视为匹配;...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/
“目录之外的所有条目。这使我们能够在较小的数据集上工作。
当“
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()
函数中的另一段代码已经使用的相同技巧。不幸的是,到目前为止还没有发现这一点,因为代码使用的参数略有不同,例如。
字符串
将“
sub/file
”报告为具有“label
”属性的路径,因为两者都不会触发公共前缀优化。