Git-LFS
Git LFS:(Large File Storage)把音乐、图片、视频等指定的任意文件存在 Git 仓库之外,而在 Git 仓库中用一个占用空间 1KB 不到的文本指针来代替文件的存在,通过把大文件存储在 Git 仓库之外,可以减小 Git 仓库本身的体积,使克隆 Git 仓库的速度加快,也使得 Git 不会因为仓库中充满大文件而损失性能;
核心思想:把需要进行版本管理、但又占用很大空间的那部分文件独立于 Git 仓库进行管理。从而加快克隆仓库本身的速度,同时获得灵活的管理 LFS 对象的能力
下载与安装
前提:Git 的版本不低于 1.8.5
详见官网:https://git-lfs.github.com/
Windows
- 下载
- 安装
- 执行 git lfs install
Linux
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt-get install git-lfs
git lfs install
macOS 系统
brew install git-lfs
git lfs install
常用命令
基本使用
#配置需要使用 Git LFS 管理的文件
git lfs track "*.pdf"
#在Git仓库根目录下的 .gitattributes中生成:*.pdf filter=lfs diff=lfs merge=lfs -text;同样可以通过修改.gitattributes文件来配置追踪文件
# 不再使用 Git LFS 管理指定的文件
git lfs untrack "*.pdf"
#查看lfs管理的文件
git lfs track
# 类似git status,查看当前 Git LFS 对象的状态
git lfs status
# 枚举所有被 Git LFS 管理的文件
git lfs ls-files
# 查看 Git LFS 版本
git lfs version
#git lfs clone通过合并获取 LFS 对象的请求,减少了 LFS API 的调用,并行化 LFS 对象的下载,从而达到显著的速度提升。同样也兼容没有使用 LFS 的仓库。即无论要克隆的仓库是否使用 LFS,都可以使用 git lfs clone 命令来进行克隆。
#目前最新版本的 git clone 已经能够提供与 git lfs clone 一致的性能,因此自 Git LFS 2.3.0 版本起,git lfs clone 已不再推荐使用。
git lfs clone url/ssh
只获取仓库本身,而不获取任何 LFS 对象
GIT_LFS_SKIP_SMUDGE=1 git clone https://github.com/user/repo.git
# 或
git -c filter.lfs.smudge= -c filter.lfs.required=false clone https://github.com/user/repo.git
#这两条命令适用于其他git命令;如checkout、ret等
只推送仓库本身,而不推送任何 LFS 对象
#如果当前仓库启用了 LFS,而还需要将该仓库备份至其他不支持 LFS 的 git 服务器,那么可以在 push 时加上 --no-verify 参数来跳过 LFS 对象的提交
git push --no-verify backup master
获取当前 commit 下包含的 LFS 对象的当前版本
#如果起初获取代码时,没有一并获取 LFS 对象,而随后又需要这些被 LFS 管理的文件时,可以单独执行 LFS 命令来获取并签出 LFS 对象:
git lfs fetch
git lfs checkout
# 或
git lfs pull
仅获取指定目录下的 LFS 对象
git config lfs.fetchinclude 'dir/**'
#随后的命令git checkout, git reset, git lfs fetch, git lfs pull 等都会只处理所指定的文件夹
git config lfs.fetchexclude 'dir/**'
#选择仅排除指定的文件夹
获取指定时间的版本
#Git LFS 相关命令在获取 LFS 对象时,默认仅会获取该对象当前被引用的版本,如果想要一次获取 LFS 对象的当前及最近版本的话,我们首先需要对最近进行定义:
git config lfs.fetchrecentcommitsdays 7
#7 表示同时下载过去 7 天内的版本(相对于获取的 LFS 对象的时间),该项配置默认值为 0,即不获取过去的版本,而仅获取指定的版本
场景
迁移已有的 git 仓库,需要使用 git lfs 管理
# 重写 master 分支,将历史提交中的 *.zip 都用 git lfs 进行管理
git lfs migrate import --include-ref=master --include="*.zip"
# 重写所有分支及标签,将历史提交中的 *.rar,*.zip 都用 git lfs 进行管理
git lfs migrate import --everything --include="*.rar,*.zip"
注意:
- 重写历史后的提交需执行 git commit --force
- 如有迁移至 git lfs 前的仓库的多份拷贝,其他拷贝可能需要执行 git reset --hard origin/master 来重置其本地的分支,注意执行 git reset --hard 命令将会丢失本地的改动。