Git LFS 递归跟踪文件夹

183

使用Git LFS,是否可以递归跟踪包含在文件夹及其子文件夹中的所有文件?

我想做类似于这样的事情:

git lfs track myfolder/*

1
好问题。确实,这可能是对社区有广泛用处的文档。有时,理解Git LFS可能是一项挑战。感谢您的努力和描述。 - Francisco Maria Calisto
2个回答

272
使用 git lfs track "myfolder/**",使用引号避免shell已经扩展了模式。 track 命令所做的只是写入到 .gitattributes,它使用(几乎)与 .gitignore 相同的模式匹配规则,详见PATTERN FORMAT 的描述。

31
你可能是shell扩展的受害者,也就是说,在传递给Git之前,myfolder/**已经被shell扩展了。我已经更新了我的回答,添加了引号,应该可以解决这个问题。 - sschuberth
3
.gitattributes文件并不完全遵循上述git-scm链接所记录的模式匹配规则,否则"myfolder/**"就可以被"myfolder/"替换,符合语句"foo/将匹配目录foo及其下面的路径"。 我认为(未经确认)"myfolder/"在.gitignore中可行是因为忽略过程会经过文件系统并在匹配时停止,但.gitattributes则与预先存在的列表进行匹配。如果您发现有不同情况,请注明反转的git/git-lfs版本并添加评论。 - SensorSmith
4
可以,这对我有效,并且根据评论来看也适用于其他人。如果你是在Windows系统上操作,请注意该命令必须从Git Bash中使用,而不是从“cmd”中使用。 - sschuberth
13
我必须使用 git lfs track "myfolder/**/*" 才能使其正常工作。 - Luc
6
我用 had to use git lfs track myfolder/**/* 命令(不带引号)在 MacOS 上进行了操作。 - DavidS1992
显示剩余7条评论

3

这样您就可以跟踪任何带有子文件夹的文件夹。您想要递归地跟踪带有“n”个文件夹和“m”个子文件夹的文件夹。我建议您按照以下方式进行操作。

  1. 使用以下命令查找所有文件扩展名
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u  
  1. 然后创建一个 .gitattribute 文件并添加 git lfs track 语法。这个命令会为您生成它,它会跟踪所有文件及其扩展名,并创建 LFS 跟踪语法。
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u | awk '{print $1" filter=lfs diff=lfs merge=lfs -text"}' | sed 's/^/*./'
  1. 将输出复制粘贴到.gitattribute文件中并提交。

对于以下情况有效:

  1. 任意数量的文件和文件夹。
  2. 具有大量小文件的大型仓库,使得仓库大小非常大。
  3. 任意数量的文件夹和子文件夹。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接