Git LFS:如何使 .gitattributes 捕获多个具有相同名称但位于不同文件夹中的无扩展名文件,而没有带扩展名的文件

问题描述

我正在尝试为 Git LFS 设置 .gitattributes 以捕获具有特定名称的所有无扩展名文件。它们分散在不同的文件夹中。而且我不希望它捕获那些具有相同名称但带有扩展名的文件。 示例:

A/B/C/D/Foo
A/B/C/D/Foo.Meta
A/B/C/D/E/Foo
A/B/C/D/E/Foo.Meta
A/B/F/Foo
A/B/F/Foo.Meta

应该捕获三个 Foo 文件,但不应该捕获三个 Foo.Meta 文件

在整个生产过程中自动生成文件夹中可能会出现更多此类文件。所以硬编码路径并不理想。

我尝试将以下内容添加到我的 .gitattributes:

Foo diff=lfs merge=lfs -text

这几乎可以工作,而且还能捕获 Foo.Meta 文件。以下是不允许的,因为“在 git 属性中忽略了否定模式”:

Foo diff=lfs merge=lfs -text
!.Meta diff=lfs merge=lfs -text

任何帮助将不胜感激!

解决方法

首先,我会注意到 Foo 本身与 Foo.meta 不匹配(我已经测试了这一点,尽管在稍微陈旧的 Git 2.27.0 中)。您必须使用类似 Foo* 的内容,如下面的示例所示。

尽管在 .gitattributes 中禁止 否定 模式,肯定 模式可以满足您的一切需要:

Foo*    attr1=value1 attr2=value2
*.meta  !attr1

这利用了靠近 the gitattributes documentation 前面的段落:

有时您需要覆盖某个属性的设置 Unspecified 状态的路径。这可以通过列出名称来完成 以感叹号 ! 为前缀的属性。

注意前面的段落:

当多个模式匹配路径时,后面的一行会覆盖 较早的一行。这种覆盖是按属性完成的。

这里,名称以 Foo 开头的所有文件都采用 attr1=value1,但所有名称以 .meta 结尾的文件都将 attr1 完全删除。所有名称以 Foo 开头的文件也采用 attr2=value2;第二行保持有效,因为它没有明确清除 attr2。如果您愿意,只需添加 !attr2

,

谢谢@torek - 你让我走上了正轨!

事实证明,问题在于我如何测试 .gitattributes!因为我不希望大文件不小心出现在 git 上,所以我运行了以下命令来测试会发生什么:

git lfs status

但它没有显示正确的结果!它将 Foo.meta 文件显示为“Git LFS objects to be pushed to origin/master:”。但是当我实际推送时,没有一个 .meta 文件进入 Git LFS(只有无扩展名的文件)。

所以一切都很好 - 除了为什么 git lfs status 没有给出正确的结果。但我想这是另一个问题。