Git大文件存储
详解 Git 大文件存储(Git LFS) - 知乎 (zhihu.com)
本文翻译自 Atlassian 官方介绍 Git LFS 的文章,Atlassian 是 Git LFS 的主要开发者之一,这篇介绍 Git LFS 的文章比较权威,讲的也很详细。原文地址:
什么是Git LFS
Git是分布式版本控制系统,这意味着在克隆过程中会将仓库的整个历史记录传输到客户端。对于包含大文件(尤其是经常被修改的大文件)的项目,初始克隆需要大量时间,因为客户端会下载每个文件对应的版本。Git LFS(Large File Storage)是由 Atlassian, GitHub 以及其他开源贡献者开发的 Git 扩展,它通过延迟地(lazily)下载大文件的相关版本来减少大文件在仓库中的影响,具体来说,大文件是在 checkout 的过程中下载的,而不是 clone 或 fetch 过程中下载的(这意味着你在后台定时 fetch 远端仓库内容到本地时,并不会下载大文件内容,而是在你 checkout 到工作区的时候才会真正去下载大文件的内容)。
Git LFS通过将仓库中大文件替换为微小的指针(pointer)文件来做到这一点。正常使用期间,你将永远不会看到这些指针文件,因为它们是由GitFLS自动处理的。
- 当你添加(执行git add命令)一个文件到你的仓库,Git LFS用一个指针替换其内容,并将文件内容存储在本地GitFLS缓存中(本地 LFS缓存位于仓库的.git/lfs/objects目录中)
- 当你推送新的提交到服务器时,新推送的提交引用的所有GitLFS文件都会从本地GitLFS缓存传输到绑定Git仓库的远程GitLFS存储(即LFS文件内容会直接从本地GitLFS缓存传输到GitLFS存储服务器)
- 当你 checkout 一个包含 Git LFS 指针的提交时,指针文件将替换为本地 Git LFS 缓存中的文件,或者从远端 Git LFS 存储区下载。
关于LFS的指针文件
LFS的指针文件是一个文本文件,存储在Git仓库中,对应大文件的内容存储在LFS服务器里,而不是Git仓库,下面为一个LFS文件的指针文件内容
version https://git-lfs.github.com/spec/v1
oid sha256:5b62e134d2478ae0bbded57f6be8f048d8d916cb876f0656a8a6d1363716d999
size 285
指针文件很小,小于1KB,其格式为key-value格式,第一行为指针文件规范URL,第二行为文件的对象id,也即LFS文件的存储对象文件名,可以再.git/lfs/objects 目录中找到该文件的存储对象,第三行为文件的实际大小(单位为字节)。所有 LFS 指针文件都是这种格式。
Git LFS 是无缝的:在你的工作副本中,你只会看到实际的文件内容。这意味着你不需要更改现有的 Git 工作流程就可以使用 Git LFS。你只需按常规进行 git checkout、编辑文件、git add 和 git commit。git clone 和 git pull 将明显更快,因为你只下载实际检出的提交所引用的大文件版本,而不是曾经存在过的文件的每一个版本。
为了使用 Git LFS,你将需要一个支持 Git LFS 的托管服务器,例如Bitbucket Cloud或Bitbucket Server(GitHub、GitLab也都支持 Git LFS)。仓库用户将需要安装 Git LFS 命令行客户端(参考这里其实更好),或支持 Git LFS 的 GUI 客户端,例如Sourcetree。