当我们使用git管理文件版本的时候,经常会有一些比较大的文件,比如一些模型文件,或者备份的文档资料等,这些文件属于如果太大,就会给git的管理带来困难。
所以,对于这种大文件,一般我们就会采用lfs工具,来单独管理这种文件。
使用lfs管理文件之后,进行推送的时候,大文件会被替换成一个引用地址,拉取的时候,又会自动地替换回来。
安装lfs
lfs没有跟git一起,需要单独安装。
在Fedora等系统里,可以直接通过
dnf install git-lfs
安装。
安装的最后,会看到输出:
>>> Scriptlet 输出:
>>> Git LFS initialized.
>>>
完成!
表示初始化成功。之后就可以使用git lfs命令了。
如果是Ubuntu等系统,则是
apt install git-lfs
跟踪大文件
在项目源代码里,需要先建立对大文件的跟踪,之后才能加入大文件,进行管理。
建立对大文件的跟踪的命令是track。
如:
git lfs track *.mp4
执行之后,我们会看到项目根目录下面,多了一个.gitattributes文件,这就是管理大文件的配置文件。
之后再加入的.mp4结尾的文件,将自动进入lfs的管理。
如:
git add a.mp4
提交历史中的大文件
有的时候,当我们想使用lfs的时候,大文件已经在git里提交过了。
这时候就需要使用lfs的migrate命令来进行迁移,之后再强行推送到远端仓库。
如:
# 迁移所有历史中的指定文件(例如*.mp4和*.zip)
git lfs migrate import --include="*.mp4,*.zip" --everything
# 检查迁移后的历史是否正确
git log --stat
# 强制推送所有分支到远程仓库
git push origin --force --all
# 强制推送所有标签到远程仓库
git push origin --force --tags
其中,
--include
参数指定要迁移的文件模式,支持通配符。--everything
表示处理所有分支和标签的历史。
通过以上步骤,历史提交中的大文件将被替换为LFS指针,并纳入LFS管理。
.gitattributes文件的-text
在 .gitattributes 文件中,-text 是一个 Git 属性设置,用于明确禁止 Git 对特定文件进行换行符(line endings)的自动转换。
如:
*.png -text
*.zip -text
*.exe -text
注:这里的语法有点儿令人费解。text明明表示文本,为什么使用-text却是让lfs按照二进制的方法管理文件呢?其实,这里的语法是一个-,再加上text,即减去text属性的意思。
所以,实际上这个text有三种使用方式:
text
:允许 Git 自动转换换行符(例如*.sh text
)。text=auto
:让 Git 自动判断是否为文本文件(默认行为)。-text
:强制禁用换行符转换,即使文件看起来像文本。
强制拉取与推送
当推送或拉取仓库时,Git LFS 会自动下载真实文件,无需手动操作。
但是,也有偶尔出错的情况,比如网络问题,或者其它错误使用,导致了拉取之后,本地的大文件仅仅是一个文件指针(文件很小,里面只是一个路径)。
这时候,就需要手动执行lfs pull
命令:
git lfs pull
再比如出现大文件推送失败的时候,也可以使用lfs push
命令:
git lfs push