我想在存储库范围内为某种文件类型启用Git LFS,但在选定的子文件夹中禁用它,即在Git存储库中完成LFS的模块化管理。
正如https://git-scm.com/docs/gitattributes所指出的,特别是https://git-scm.com/docs/gitattributes#_examples,这应该可以通过配置专用
.gitattributes
来实现
相应文件夹中的文件。
但是,它并不像方面那样工作。如果在存储库的根文件夹中启用了 LFS,则在子文件夹中禁用它不会产生任何影响。相反,在顶层禁用它并在子文件夹中启用它也可以。
我创建了一个测试存储库,其中包含不同级别的三个
.gitattributes
文件
TEST-PARTIAL-LFS
│ .gitattributes
│
├───lfs
│ .gitattributes
│ file_01.mat
│
└───no-lfs
.gitattributes
file_02.mat
lfs/.gitattributes
的内容如下所示(启用lfs):
*.[mM][aA][tT] filter=lfs diff=lfs merge=lfs -text
no-lfs/.gitattributes
的内容如下所示(禁用lfs):
*.[mM][aA][tT] -text -diff -merge
然而,行为最终是由顶层控制的
.gitattributes
- 但不一致。
如果我在顶级文件中使用禁用模式,
*.[mM][aA][tT] -text -diff -merge
然后
file_01.mat
被添加到 LFS,而 file_02.mat
则不是 - 如方面所述。
如果我在顶级文件中使用启用模式,
*.[mM][aA][tT] filter=lfs diff=lfs merge=lfs -text
然后将
file_01.mat
添加到 LFS 并且 file_02.mat
是 too。这里,禁用本地模式被忽略。
有什么提示吗?
没有
$GIT_DIR/info/attributes
。
我使用
git lfs ls-files
来检查LFS状态。
我用git version 2.45.2.windows.1
。
当您在顶级文件(*.mat filter=lfs
)中使用
启用模式和在
no-lfs/.gitattributes
(*.mat -text -diff -merge
)中使用禁用模式时,您不会禁用
filter
属性,因此它是从顶级继承的.gitattributes
。您可以使用git check-attr
来查看它:
$ git check-attr -a no-lfs/file_02.mat
no-lfs/file_02.mat: diff: unset
no-lfs/file_02.mat: merge: unset
no-lfs/file_02.mat: text: unset
no-lfs/file_02.mat: filter: lfs
filter
设置为 lfs
。
您需要在no-lfs/.gitattributes
中取消设置:
$ echo "*.[mM][aA][tT] -text -diff -merge -filter" >no-lfs/.gitattributes
$ cat no-lfs/.gitattributes
*.[mM][aA][tT] -text -diff -merge -filter
$ git check-attr -a no-lfs/file_02.mat
no-lfs/file_02.mat: diff: unset
no-lfs/file_02.mat: merge: unset
no-lfs/file_02.mat: text: unset
no-lfs/file_02.mat: filter: unset
取消设置!