Git-LFS:大文件也有了版本管理
关于 GitHub 的大小限制
GitHub 限制存储库中允许的文件大小。 如果尝试添加或更新大于 50 MB 的文件,您将从 Git 收到警告。 更改仍将成功推送到仓库,但您可以考虑删除提交,以尽量减少对性能的影响。
GitHub 阻止超过 100 MB 的推送。
要跟踪超出此限制的文件,必须使用 Git Large File Storage (Git LFS)。 更多信息请参阅“关于 Git Large File Storage”。
Git LFS:(Large File Storage)把音乐、图片、视频等指定的任意文件存在 Git 仓库之外,而在 Git 仓库中用一个占用空间 1KB 不到的文本指针来代替文件的存在,通过把大文件存储在 Git 仓库之外,可以减小 Git 仓库本身的体积,使克隆 Git 仓库的速度加快,也使得 Git 不会因为仓库中充满大文件而损失性能;
如果您选择在仓库存档中包含 Git LFS 对象,则每次下载这些存档都会计入您帐户的带宽使用量。 每个帐户每月免费获得 1 GB 的带宽,您可以付费获得额外用量。 更多信息请参阅“关于存储和带宽使用”和“管理 Git Large File Storage 的计费”。
**核心思想:**把需要进行版本管理、但又占用很大空间的那部分文件独立于 Git 仓库进行管理。从而加快克隆仓库本身的速度,同时获得灵活的管理 LFS 对象的能力
安装 Git Large File Storage
Mac
- 导航到git-lfs.github.com并单击Download(下载)。 也可以使用包管理器安装 Git LFS:
- 如果安装用于 Homebrew 或 MacPorts 的 Git LFS,请跳至步骤 6。
- 在计算机上,找到并解压缩下载的文件。
- 打开 Terminal(终端)。
- 将当前工作目录更改为您下载并解压缩的文件夹。
$ cd ~/Downloads/git-lfs-1.X.X
- **注:**在
cd
后面使用的文件路径取决于您的操作系统、下载的 Git LFS 版本以及保存 Git LFS 下载的位置。 - 要安装该文件,请运行以下命令:
$ ./install.sh > Git LFS initialized.
- **注:**您可能必须使用
sudo ./install.sh
来安装文件。 - 验证安装成功:
$ git lfs install > Git LFS initialized.
- 如果未看到表示
git lfs install
成功的消息,请联系 GitHub Support。 确保包含操作系统的名称。
Windows
- 导航到 git-lfs.github.com 并单击 Download(下载)。
**提示:**有关安装 Windows 版 Git LFS 的其他方法的更多信息,请参阅此入门指南。 - 在计算机上,找到下载的文件。
- 双击文件 git-lfs-windows-1.X.X.exe,其中 1.X.X 替换为您下载的 Git LFS 版本。 打开此文件时,Windows 将运行安装程序向导以安装 Git LFS。
- 打开 Git Bash。
- 验证安装成功:
C:\Users\FLY>git lfs install Git LFS initialized. C:\Users\FLY>
- 如果未看到表示
git lfs install
成功的消息,请联系 GitHub Support。 确保包含操作系统的名称。
Linux
- 导航到 git-lfs.github.com 并单击 Download(下载)。
**提示:**有关安装 Linux 版 Git LFS 的其他方法的更多信息,请参阅此入门指南。 - 在计算机上,找到并解压缩下载的文件。
- 打开 Terminal(终端)。
- 将当前工作目录更改为您下载并解压缩的文件夹。
$ cd ~/Downloads/git-lfs-1.X.X
- **注:**在
cd
后面使用的文件路径取决于您的操作系统、下载的 Git LFS 版本以及保存 Git LFS 下载的位置。 - 要安装该文件,请运行以下命令:
$ ./install.sh > Git LFS initialized.
- **注:**您可能必须使用
sudo ./install.sh
来安装文件。 - 验证安装成功:
$ git lfs install > Git LFS initialized.
- 如果未看到表示
git lfs install
成功的消息,请联系 GitHub Support。 确保包含操作系统的名称。
配置 Git Large File Storage
安装 [Git LFS] 后,需要将其与仓库中的大文件相关联。
Mac
如果仓库中存在要用于 GitHub 的现有文件,则需要先从仓库中删除它们,然后在本地将其添加到 Git LFS。 更多信息请参阅“将仓库中的文件移动到 Git LFS”。
如果有引用的 Git LFS 文件未成功上传,您将收到一条错误消息。 更多信息请参阅“解决 Git Large File Storage 上传失败”。
- 打开 Terminal(终端)。
- 将当前工作目录更改为要用于 Git LFS 的现有仓库。
- 要将仓库中的文件类型与 Git LFS 相关联,请输入
git lfs track
,后跟要自动上传到 Git LFS 的文件扩展名。例如,要关联.psd文件,请输入以下命令:
$ git lfs track "*.psd" > Adding path *.psd
- 要与 Git LFS 关联的每个文件类型都需要添加
git lfs track
。 此命令将修改仓库的.gitattributes文件,并将大文件与 Git LFS 相关联。**注意:**我们强烈建议您将本地.gitattributes文件提交到仓库中。
- 依赖与 Git LFS 关联的全局 .gitattributes 文件,可能会导致在参与其他 Git 项目时发生冲突。
- 在存储库中包含 .gitattributes 文件允许创建复刻或新克隆的人员使用 Git LFS 更轻松地进行协作。
- 在存储库中包含 .gitattributes 文件允许 Git LFS 对象选择性地包含在 ZIP 文件和压缩包存档中。
- 将文件添加到与关联的扩展名相匹配的仓库:
$ git add path/to/file.psd
- 提交文件并将其推送到 GitHub:
$ git commit -m "add file.psd" $ git push
- 您会看到一些有关文件上传的诊断信息:
> Sending file.psd > 44.74 MB / 81.04 MB 55.21 % 14s > 64.74 MB / 81.04 MB 79.21 % 3s
Windows
如果仓库中存在要用于 GitHub 的现有文件,则需要先从仓库中删除它们,然后在本地将其添加到 Git LFS。 更多信息请参阅“将仓库中的文件移动到 Git LFS”。
如果有引用的 Git LFS 文件未成功上传,您将收到一条错误消息。 更多信息请参阅“解决 Git Large File Storage 上传失败”。
- 打开 Git Bash。
- 将当前工作目录更改为要用于 Git LFS 的现有仓库。
- 要将仓库中的文件类型与 Git LFS 相关联,请输入
git lfs track
,后跟要自动上传到 Git LFS 的文件扩展名。例如,要关联.psd文件,请输入以下命令:
$ git lfs track "*.psd" > Adding path *.psd
- 要与 Git LFS 关联的每个文件类型都需要添加
git lfs track
。 此命令将修改仓库的.gitattributes文件,并将大文件与 Git LFS 相关联。**注意:**我们强烈建议您将本地.gitattributes文件提交到仓库中。
- 依赖与 Git LFS 关联的全局 .gitattributes 文件,可能会导致在参与其他 Git 项目时发生冲突。
- 在存储库中包含 .gitattributes 文件允许创建复刻或新克隆的人员使用 Git LFS 更轻松地进行协作。
- 在存储库中包含 .gitattributes 文件允许 Git LFS 对象选择性地包含在 ZIP 文件和压缩包存档中。
- 将文件添加到与关联的扩展名相匹配的仓库:
$ git add path/to/file.psd
- 提交文件并将其推送到 GitHub:
$ git commit -m "add file.psd" $ git push
- 您会看到一些有关文件上传的诊断信息:
> Sending file.psd > 44.74 MB / 81.04 MB 55.21 % 14s > 64.74 MB / 81.04 MB 79.21 % 3s
Linux
如果仓库中存在要用于 GitHub 的现有文件,则需要先从仓库中删除它们,然后在本地将其添加到 Git LFS。 更多信息请参阅“将仓库中的文件移动到 Git LFS”。
如果有引用的 Git LFS 文件未成功上传,您将收到一条错误消息。 更多信息请参阅“解决 Git Large File Storage 上传失败”。
- 打开 Terminal(终端)。
- 将当前工作目录更改为要用于 Git LFS 的现有仓库。
- 要将仓库中的文件类型与 Git LFS 相关联,请输入
git lfs track
,后跟要自动上传到 Git LFS 的文件扩展名。例如,要关联.psd文件,请输入以下命令:
$ git lfs track "*.psd" > Adding path *.psd
- 要与 Git LFS 关联的每个文件类型都需要添加
git lfs track
。 此命令将修改仓库的.gitattributes文件,并将大文件与 Git LFS 相关联。**注意:**我们强烈建议您将本地.gitattributes文件提交到仓库中。
- 依赖与 Git LFS 关联的全局 .gitattributes 文件,可能会导致在参与其他 Git 项目时发生冲突。
- 在存储库中包含 .gitattributes 文件允许创建复刻或新克隆的人员使用 Git LFS 更轻松地进行协作。
- 在存储库中包含 .gitattributes 文件允许 Git LFS 对象选择性地包含在 ZIP 文件和压缩包存档中。
- 将文件添加到与关联的扩展名相匹配的仓库:
$ git add path/to/file.psd
- 提交文件并将其推送到 GitHub:
$ git commit -m "add file.psd" $ git push
- 您会看到一些有关文件上传的诊断信息:
> Sending file.psd > 44.74 MB / 81.04 MB 55.21 % 14s > 64.74 MB / 81.04 MB 79.21 % 3s
常用命令
基本使用
#配置需要使用 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
获取指定时间的版本
#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 命令将会丢失本地的改动。