2017-08-25

使用 Git LFS 儲存大型檔案

分散式版控 Git 雖然已經改善了許多集中式版控的缺點,但針對內容 hash 的作法對於大型 binary 檔案,效能還是不夠令人滿意,針對這個問題 GitHub 與 GitLab 分別提出 Git LFS 與 Git Annex 做為處理大型檔案的解決方案

而市場上普遍使用 GitHub 所提出的 Git LFS(Large File Storage),就來看看 Git LFS 與 Git Annex 的差異與該如何使用 Git Lfs 吧


Git LFS 與 Git Annex 的不同之處

- Git LFS Git Annex
傳輸協定 SSH and Https SSH
指令難易度 簡單 複雜
儲存方式 Repository 外的檔案伺服器
透過 text pointers 指向
Repository 中的子目錄
平台支援度 各平台皆支援 Windows x64 不是全功能支援
雲端服務支援度 github, bitbucket,gitlab gitlab

安裝 Git LFS

  1. 下載 Git-LFS-Windows 並安裝 下載位置

    1install1

    2install2

  2. 初始化 Git LFS

    git lfs install

    3ini

如何使用 Git LFS

  1. 將大檔加入 Git LFS 追蹤

    可以針對 單檔特定附檔名 或是 資料夾 加入

    git lfs track "*.exe

    4lfstrack

  2. 會修改 .gitattributes 記得加入版控

    git add .gitattributes

    5gitattribute

  3. Push 到 Git server

    git add .
    git commit -m "Add large file"
    git push origin master
    

如何 Clone 及 Pull

可以直接使用 git clonegit pull,但可以使用 git lfs clonegit lfs pull 來加速

  1. Clone
    • git clone

      6gotclone

    • git lfs clone

      7gitlfsclone

  2. Pull

    使用情境和 clone 不同,一般情境只需使用 git pull,如果遇到無法順利取得完整檔案時才需要明確使用 git lfs pull

    • git pull

      8gitpull

    • git lfs pull

      下載缺漏 lfs 檔案

其他指令

  1. 設定只取得 repository 指標不取得實際檔案,只在需要時才透過 git lfs pull 取得檔案
    • 全域設定

      git -c filter.lfs.smudge= -c filter.lfs.required=false pull && git lfs pull

    • 單一 repository

      git -c filter.lfs.smudge= -c filter.lfs.required=false clone https://github.com/user/repo.git

  2. 取得幾天內的版本
    • 設定近期天數

      git config lfs.fetchrecentcommitsdays 7

    • 永遠使用最近

      git config lfs.fetchrecentalways true

    • 取得指令

      git lfs fetch --recent

  3. 從 local 刪除遠端已被移除的檔案

    git lfs prune

  4. 納入或排除特定資料夾或是檔案
    • 納入特定資料夾

      git config lfs.fetchinclude 'folder/**'

    • 排除特定標案

      git config lfs.fetchexclude 'folder/a.mp4'

心得

Git LFS 的內容很少,指令也很容易,但一陣子沒用,指令又生疏不少,所以紀錄一下

剛好趁這個機會釐清了 git lfs 的指令涵義

參考資訊

  1. 超大影音檔版本控管更簡單了!GitHub釋出LFS擴充機制能幫忙
  2. Differences between Git Annex and Git LFS
  3. How do Git LFS and git-annex differ?
  4. Git Large File Storage
  5. git-lfs

沒有留言:

張貼留言