轉載自:https://cloud.tencent.com/developer/article/1010589
1、Git LFS 介紹
Git 大文件存儲(Large File Storage,簡稱LFS)目的是更好地把大型二進制文件,比如音頻文件、數據集、圖像和視頻等集成到 Git 的工作流中。我們知道,Git 存儲二進制效率不高,因為它會壓縮並存儲二進制文件的所有完整版本,隨着版本的不斷增長以及二進制文件越來越多,這種存儲方案並不是最優方案。而 LFS 處理大型二進制文件的方式是用文本指針替換它們,這些文本指針實際上是包含二進制文件信息的文本文件。文本指針存儲在 Git 中,而大文件本身通過HTTPS托管在Git LFS服務器上。
2、環境、軟件准備
本次演示環境,我是在虛擬機Linux Centos7上操作,以下是安裝的軟件及版本:
- Docker:version 1.12.6
- Git:version 2.10.1
- GitLab: GitLab Community Edition 9.1.4
- Git-lfs: version 2.2.1
注意:GitLab 這里我使用基於 Docker 安裝,所以需要先安裝一下 Docker,后邊演示 Git-lfs 操作,需要本地先安裝 Git,這里 Git、GitLab、Docker 的安裝忽略,着重講一下 Git lfs。
3、Git LFS 安裝
客戶端 Git LFS 安裝步驟很簡單,有好幾種安裝方式:
1、去 Git LFS 官網下載最新版安裝包安裝
$ wget https://github.com/git-lfs/git-lfs/releases/download/v2.2.1/git-lfs-darwin-amd64-2.2.1.tar.gz
$ tar -zxvf git-lfs-darwin-amd64-2.2.1.tar.gz
$ cd git-lfs-2.2.1
$ ./install.sh
2、 brew 安裝方式
$ brew install git-lfs
3、直接 git 命令安裝
$ git lfs install
注意:Git LFS客戶端版本必須 >= 1.0.1,這里我們安裝的版本是2.2.1。
4、GitLab LFS 的配置
為了更好的服務社區,滿足版本大型文件的需求,GitLab 宣布支持 Git LFS,現在已經包括在 GitLab.com,GitLab 社區版本和 GitLab 企業版本。但是 GitLab 對 Git LFS 支持需要滿足:
- Git LFS is supported in GitLab starting with version 8.2. (gitlab版本需要 >= 8.2)
- Git LFS must be enabled under project settings (必須在項目設置中開啟LFS)
- Users need to install Git LFS client version 1.0.1 and up (本地git lfs客戶端版本 >= 1.0.1)
4.1 配置 GitLab 是否開啟 Git LFS 以及修改默認 LFS 存儲路徑。
新版 GitLab 默認是開啟 Git LFS 支持,默認存儲路徑為:{gitlab_rails['shared_path']}/lfs-objects
。若我們想關閉 Git LFS 或者修改存儲路徑的話,可以通過下邊方法修改:
1、GitLab 以 Omnibus packages 混合包安裝
修改/etc/gitlab/gitlab.rb
gitlab_rails['lfs_enabled'] = true | false
#默認位置:`/var/opt/gitlab/gitlab-rails/shared/lfs-objects`
gitlab_rails['lfs_storage_path'] = "/mnt/storage/lfs-objects"
2、GitLab 以 source 源碼安裝
修改config/gitlab.yml:
lfs:
enabled: false | true
storage_path: /mnt/storage/lfs-objects
4.2 GitLab 的 Project 設置開啟 LFS
在 GitLab 中設置項目的 LFS 開啟|關閉:project -> setting -> general -> project settings -> LFS enabled/disabled。具體設置看4.3.1中的圖。
4.3 示例操作
為了更好的演示操作,我們新建兩個項目,分別為 demo1 和 demo2 ,demo1 不開啟 LFS 支持,demo2 開啟 LFS 支持,然后我們分別進行一下操作,看看他們區別:
1、先設置項目 LFS 開啟|關閉
2、Git操作
我們先分別提交稍大一些的文件到各個項目中
$ git clone http://wanyang3@10.236.65.134/scm/demo1.git
$ cd demo1
$ cp ~/Downloads/soft/apache-tomcat-8.0.36.zip ./
$ git add .
$ git commit -m "test no lfs"
$ git push origin master
$ git clone http://wanyang3@10.236.65.134/scm/demo2.git
$ cd demo2
$ cp ~/Downloads/soft/apache-tomcat-8.0.36.zip ./
$ git lfs track "*.zip" #設置存儲到 LFS 的文件擴展名,這里我設置 .zip 后綴格式的文件
$ cat .gitattributes #自動生成的文件,需一並提交到 Git,否則 Clone 項目的時候 Git LFS 不起作用
* .zip filter=lfs diff=lfs merge=lfs -text
$ git add .
$ git commit -m "test with lfs"
$ git push origin master
注意:我們對比下使用 LFS 和不使用 LFS 的項目操作,只需要在想加入的大文件時,增加文件后綴,執行git lfs track "*.zip"·
一條語句即可,並未產生額外的 Git 指令,還是很容易上手的。
然后,我們在分別 Clone 各個項目
$ git clone http://wanyang3@10.236.65.134/scm/demo1.git
Cloning into 'demo1'...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
$ git clone http://wanyang3@10.236.65.134/scm/demo2.git
Cloning into 'demo2'...
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 7 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (7/7), done.
Downloading apache-tomcat-8.0.36.zip (9.9 MB)
或者
$ git lfs clone http://wanyang3@10.236.65.134/scm/demo2.git
Cloning into 'demo2'...
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 7 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (7/7), done.
Git LFS: (1 of 1 files) 9.40 MB / 9.40 MB
注意:
- 這里我們可以看出,使用 LFS 的項目,Clone 時會提示 Downloading … 或者 Git LFS … ,當 Push 的文件更大一些的時候,我們會發現使用 LFS 的項目復制和提取文件會更快一些。
- 這里可使用
git clone ...
或者使用git lfs clone ...
即指定該項目使用 lfs 均可,具體 git lfs 其他命令,可參考git lfs help
命令。 - 開啟 LFS 的項目,當 Push 大文件之后,在 GitLab Web 頁面上是刪除不了的,需要通過接口刪除該文件。
參考資料: