使用 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 LFSGit Annex
傳輸協定SSH and HttpsSSH
指令難易度簡單複雜
儲存方式Repository 外的檔案伺服器
透過 text pointers 指向Repository 中的子目錄
平台支援度各平台皆支援Windows x64 不是全功能支援
雲端服務支援度github, bitbucket,gitlabgitlab

安裝 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