在 Git 中咱们的最佳实践是 不要使用 Git 跟踪大型的二进制文件, 可是每每可能有一些特殊的需求. 因此咱们能够考虑使用 Git Large File Storage (LFS)
来处理.node
Git Large File Storage (LFS)
是一个由 GitHub 开发的 Git 扩展项目, 于 2013/09/22 建立. 用于加强 Git 对大文件追踪的支持.python
众所周知, Git 在储存二进制文件时, 效率堪忧, 由于 Git 默认会压缩和储存每一次提交的快照, 若是二进制文件不少, 会使得 Git 的 clone 效率变得很是低.linux
如何解决这个问题呢, 那就要介绍 Git LFS 了.git
Git LFS 处理大型二进制文件的方式是用 "文件指针" 进行替换, 这些文本指针其实是包含二进制文件信息的文本文件, 大小不到 1kb。文本指针存储在 Git 中,而大文件自己经过 HTTPS 托管在 Git LFS 服务器上。github
那么下面演示下如何安装和使用 Git LFSapi
你能够经过两种方式安装 Git LFSbash
前往 git-lfs.github.com 点击 Install Vx.x.x via PackageCloud
在跳转的页面中选择合适的安装方式, 目前支持的安装方式有 deb
,rpm
,node
,python
,gem
服务器
而后运行以下curl
# In Ubuntu
# 检查和安装 apt Repository
$ curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
# 经过 apt 安装 git-lfs
$ sudo apt install git-lfs
# In MacOS
$ brew install git-lfs
复制代码
还支持经过 deb
,rpm
,node
,python
,gem
的方式安装,详细参阅gitlab
前往 git-lfs release 页面, 下载合适的平台的二进制包, 而后运行包中的 install.sh
例如位于 linux_amd64 , 运行以下指令便可
$ tar -zxvf git-lfs-linux-amd64-v2.7.2.tar.gz
$ tree .
├── CHANGELOG.md
├── git-lfs
├── git-lfs-linux-amd64-v2.7.2.tar.gz
├── install.sh
└── README.md
$ sudo ./install.sh
复制代码
那么如何在项目中使用 Git LFS 呢, 让咱们从零开始尝试使用 Git LFS 吧
# 建立这个 DEMO 的文件夹
$ mkdir git-lfs-demo && cd git-lfs-demo
# 在当前目录建立一个 20M 的大文件
$ dd if=/dev/zero of=a-big-file.pdf bs=1M count=20
# git 初始化
$ git init
# 将 a-big-file.pdf 使用 git lfs
# 你也能够利用 git lfs track "*.pdf" 指定 所有的 pdf 文件
$ git lfs track "a-big-file.pdf"
# 接着添加远程库
$ git remote add origin git@github.com:x/x.git
# 而后提交文件
$ git add -A && git commit -a -m "git lfs test" && git push origin master
# 而后访问 github 接口查看该文件的大小
$ curl https://api.github.com/repos/x/x | grep size
# 能够看到这里的 size 写着 0, 由于是 m 为单位, 因此意味着咱们上传的东西远小于 1M
# 至此, 将二进制文件 git lfs 的形式上传到 git 仓库成功
复制代码
git-lfs 经常使用的指令包括以下:
$ git lfs track
# 将一个或者一类文件以 git lfs 的方式加入到版本控制中 (实质是修改 .gitattributes 文件)
$ git lfs untrack
# 将一个或者一类文件从 仓库中移除
$ git lfs status
# 相似于 git status , 显示 git lfs 方式的文件在 暂存区的状态
$ git lfs lock
# 锁定一个或者一些文件, 只容许当前的用户对这些文件进行修改, 防止在多人协做的场景下冲突
$ git lfs unlock
# 同上, 解锁一个或者一些文件
$ git lfs migrate
# 用来将当前已经被 git 储存库保存的文件以 git lfs 的保存 (将 git 对象转为 lfs 对象)
# 例如若是将当前远程不存在的的全部 pdf 文件清除
# git lfs migrate import --include="*.pdf"
#
# 若是是已经上传到中心服务器的内容, 则须要指定分支 (可能须要 push --force)
# git lfs migrate import --include="*.mp4" --include-ref=refs/origin/master --include-ref=refs/origin/dev --include-ref=refs/origin/test
#
# 而后使用以下命令清理 .git 目录
# git reflog expire --expire-unreachable=now --all && git gc --prune=now
$ git lfs ls-files
# 展现所有使用 git lfs 方式加入版本控制的文件
$ git lfs prune
# 删除所有旧的 Git LFS 文件
$ git lfs fetch
$ git lfs pull
$ git lfs push
$ git lfs checkout
# 正常状况下会随着 git pull/push 一块儿执行
# 若是在 git pull/push 的过程当中断了, 致使二进制文件没有被拉取的时候, 可使用这些命令(支持断点续传,速度不慢)
复制代码
能够经过 git lfs --help
指令看到 git lfs
的所有指令,
为了防止滥用, 各个平台对 Git LFS 有不一样的限制
GitHub
的所有 Repo 的 Git LFS 内容不得超过 1G
, 流量限制 1G
, 限制的仍是比较严格的, 详情
可使用每月 $5
的钞能力增长限制, 每月订阅的费用每上升 $5
, 内容大小和流量限制上升 50G
.
BitBucket 免费帐号 File Storage 限制为 1GB, $2/month 的 Standard
帐号为 5GB $5/month 的Premium
帐号为 10GB
GitLab 没有找到 Git LFS 限制的相分描述, 可是他们有提到单个 Repo 的储存限制为 10G, 想必是包含了 Git LFS 内容的大小在内.
码云中, Git LFS 功能只对付费企业和我的开放, 内容大小限制未知.
虽然 Git LFS 能给咱们在大文件上传 版本库带来不少便利, 可是仍是推荐谨慎使用.
同时推荐 Kuri-su/GitMindMap-command Git 思惟导图
ref:
欢迎到 github.com/Kuri-su/KBl… 开 Issue 讨论