Git LFS无法追踪子目录.gitattributes,大文件未全上传,是否需根目录单文件?
其实不用非得只在根目录放一个.gitattributes文件——Git LFS完全支持子目录里的这个配置文件,你遇到的上传异常问题大概率是操作或配置细节上出了小疏漏。
先明确核心结论
Git(包括Git LFS)完全支持子目录中的.gitattributes,这个文件会作用于它所在的目录及其所有子目录,所以你的多目录配置思路本身是没问题的,不是必须把所有规则都集中到根目录。
你遇到问题的可能原因及解决方法
下面是几个常见的导致子目录.gitattributes失效的原因,对应解决步骤:
子目录的
.gitattributes本身没被提交到仓库
如果这个配置文件本身没被Git追踪(也就是没执行git add和git commit),Git LFS根本看不到它的规则,自然不会按要求处理大文件。
解决:用git status检查所有子目录的.gitattributes是否处于未追踪状态,执行git add path/to/subdir/.gitattributes,然后git commit -m "Add LFS tracking rules for subdir",最后推送到Bitbucket。.gitattributes里的规则路径写错了
子目录中的规则默认是相对当前目录的,比如在big_files/目录下的.gitattributes写*.zip filter=lfs diff=lfs merge=lfs -text,只会匹配big_files/下的.zip文件;如果你的大文件在big_files/sub/里,这个规则依然生效,但如果规则写的是绝对路径(比如/big_files/*.zip)反而会出问题。
验证:执行git lfs track命令,它会列出当前所有生效的LFS追踪规则,确认子目录的规则是否在列表中。大文件是在添加
.gitattributes规则之前被Git追踪的
如果先把大文件git add到Git缓存,之后才创建的.gitattributes规则,这些已经被普通Git追踪的文件不会自动转成LFS对象。
解决:对这些大文件执行git rm --cached path/to/bigfile(注意不要加-f,不然会删除本地文件),然后重新git add path/to/bigfile,再执行git commit和git push。部分大文件没被LFS正确识别
用git lfs ls-files命令查看当前被LFS追踪的文件列表,确认那些没上传的9GB里的文件是否在列表中。如果不在,说明规则没匹配到,需要调整.gitattributes里的通配符规则。
可选优化:统一到根目录管理
虽然子目录配置是可行的,但如果你的规则较多,或者想统一管理,也可以把所有规则集中到根目录的.gitattributes里,用通配符覆盖子目录,比如:
assets/**/*.psd filter=lfs diff=lfs merge=lfs -text data/**/*.zip filter=lfs diff=lfs merge=lfs -text backup/**/*.tar.gz filter=lfs diff=lfs merge=lfs -text
这种方式也能实现子目录文件的LFS追踪,看你个人的管理习惯选择即可。
内容的提问来源于stack exchange,提问作者ruelluna

