在 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 討論