什么是 Git LFS?
Git 是跟踪代码库演变和与同行高效协作的绝佳选择。但是,当您要跟踪的存储库非常大时会发生什么?
如果您考虑一下,存储库变得庞大的主要原因大致有两个:
- 他们积累了非常非常长的历史(项目在很长一段时间内增长,包袱积累)
- 它们包括需要跟踪并与代码配对的巨大二进制。每当提交一个100MB的 文件中的细微改变,你仓库的大小当然也会增长100MB,这样快速的增长会使你的仓库因为内容太过于庞大而变得几乎无法使用。它确实与所有"大"文件有关:如视频,音频记录,数据集等的问题。
但是,不要仅仅因为你有一个大的存储库历史记录或巨大的文件而放弃 Git 的出色功能,这两个问题都有可行的解决方案。一般来说,版本控制的好处还是存在的,而且应该用于各种各样的项目当中去。
对于第一个问题,可以使用git浅层克隆和git稀疏检出方法解决,此文不做详述。
对于第二个问题,使用 LFS : 有效的处理大文件。
当然,LFS 并不能像"变魔术一样"处理所有的大型数据:它需要记录并保存每一个变化。然而,这就把负担转移给了远程服务器 - 允许本地仓库保持相对的精简。
为了实现这个可能,LFS 耍了一个小把戏:大文件是在签出过程中下载的,而不是在克隆或获取过程中下载的。它在本地仓库中并不保留所有的文件版本,而是仅根据需要提供检出版本中必需的文件。
Git LFS 通过将存储库中的大文件替换为小指针文件来实现这一点。在正常使用期间,您永远不会看到这些指针文件,因为它们由 Git LFS 自动处理:
- 当你添加一个文件到你的仓库时,Git LFS会将其内容替换成一个指针,并将文件内容存储在本地Git LFS缓存中。
- 当你推送新的提交到服务器时,新推送的提交所引用的任何 Git LFS 文件会从本地的 Git LFS 缓存转移到与你的 Git 仓库绑定的远程 Git LFS 存储。
- 当你签出一个包含Git LFS指针的提交时,它们会被替换为本地Git LFS缓存中的文件,或者从远程Git LFS存储中下载。
LFS 的指针文件是一个文本文件,存储在 Git 仓库中,对应大文件的内容存储在 LFS 服务器里,而不是 Git 仓库中。
指针文件很小,小于 1KB。其格式为 key-value 格式,第一行为指针文件规范 URL,第二行为文件的对象 id,也即 LFS 文件的存储对象文件名,可以在.git/lfs/objects 目录中找到该文件的存储对象,第三行为文件的实际大小(单位为字节)。所有 LFS 指针文件都是这种格式。
Git LFS是无缝的:在你的工作副本中,你只会看到你的实际文件内容。这意味着你可以在不改变现有的Git工作流程的情况下使用Git LFS;你只需像平常一样进行git checkout、编辑、git add和gitcommit。git clone和git pull操作将明显加快,因为你只下载你实际检出的提交所引用的大文件的版本,而不是曾经存在的文件的每个版本。
下载和安装 Git LFS
- 下载:
- Linux Debian 和 RPM packages: https://packagecloud.io/github/git-lfs/install
- Windows:目前lfs已经集成在了 Git for Windows 中,直接下载和使用最新版本的Windows Git即可。
- 直接下载二进制包:https://github.com/git-lfs/git-lfs/releases
- 依据源码构建:https://github.com/git-lfs/git-lfs
- 安装:
- 如果你选择使用二进制包下载后安装,直接执行解压后的./install.sh脚本即可,这个脚本会做两个事情:
- 在$PATH中安装Git LFS的二进制可执行文件
- 执行git lfs install命令,让当前环境支持全局的LFS配置
- 如果你选择使用二进制包下载后安装,直接执行解压后的./install.sh脚本即可,这个脚本会做两个事情:
本地新仓库支持 Git LFS
-
创建一个新的 Git LFS 仓库
要创建一个新的 Git LFS 仓库,你需要在创建仓库后运行 git lfs install。
这将在你的仓库中安装一个特殊的预推送pre-push
Git hook
Git钩子,当你git push
时,它将把Git LFS文件传输到服务器。GitLab/Github/Gitblit 它们已经支持LFS并都自动启用了LFS选项,对于没有启动的需要在仓库设置中启用Git LFS。 -
选择您希望 Git LFS 管理的文件类型(或直接编辑 .gitattributes)。您可以随时配置其他文件扩展名。
git lfs track "*.psd"
现在确保跟踪 .gitattributes:
git add .gitattributes
定义 Git LFS 应跟踪的文件类型本身不会将任何预先存在的文件转换为 Git LFS,例如其他分支上的文件或您之前的提交历史记录中的文件。这意味着你应该在文件没有提交到仓库前就让 LFS 进行追踪。
可以在初始化仓库选择配置要追踪的文件规则(就跟配置忽略文件一样)。 -
只需像往常一样提交并推送到 GitHub;例如,如果您当前的分支命名为:main
git add file.psd git commit -m "Add design file" git push origin main