前言
Git 是一款強大的版本控制系統,允許我們紀錄任何檔案的變更,並且可以輕鬆地回溯到任何一個版本,但是當需要儲存大型檔案時 Git 就會顯得力不從心,因為 Git 並不是為了儲存大型檔案(圖片、影片、音樂……等二進制檔案)而設計的。
試想一張 1MB
的圖片只要改動了 10 次,Git 就會儲存 10 個版本的圖片也就是 10 MB
到儲存庫當中!(雖然這樣簡略的說明不完全正確,實際 Git 會儲存兩個版本之間的差異,而不是儲存每個版本的完整副本,但二進位文件間差異難壓縮的問題仍是挑戰)這樣會導致效能低下、浪費儲存空間、耗費網路資源……等問題,而這次介紹的 Git Large File Storage 是 Git 的擴充,專門用於解決以上問題。
Git LFS 如何解決問題?
Git LFS 解決問題的方式是將大型檔案內容儲存在額外的伺服器上,而不是直接儲存在 Git 儲存庫中,藉由將實際大型檔案替換成指向大型檔案的指標,就算檔案再大、更動再多次,Git 儲存庫的大小都不會增加。
除了儲存得到改善,同步大型檔案到本地也更加容易,並且相較於下載整個 Git 儲存庫的歷史,使用 LFS 我們可以要求只下載當前必要的大型檔案以節省資源。
如何使用 Git LFS?
一、下載 GitLFS
首先需要安裝 Git LFS (廢話 😐)
二、設定要使用 Git LFS 的檔案
在要使用 Git LFS 的 Git 儲存庫中,選擇希望 Git LFS 管理的檔案類型(或直接編輯 .gitattributes
),可以在任何時刻配置新的需要 LFS 介入處理的檔案副檔名,以下設定告知了 LFS 需要處理所有有關 .png
副檔名的檔案。
設定完成後須確保 .gitattributes
的更動有被提交到 Git 儲存庫中。
三、提交檔案
如果你像我一樣使用 GitHub 來託管代碼,那麼只需像平常一樣提交檔案即可,GitHub 會替你處理好後續的事情 🤯。在 GitHub 上預覽 LFS 檔案時也會有標註,除此之外使用上與沒有用 LFS 體驗上完全一致。
如果想要列出當前被 LFS 管理的檔案可以執行以下指令查閱:
會得到詳盡的 LFS 管理檔案清單如下:
使用 Git LFS 後的體驗
目前整個網頁東東大型檔案都是透過 GitHub LFS 託管的,大幅的簡化了我的工作流程與提高效率。
早期這個網站建置時會需要設置額外的 CMS 伺服器,或是使用 Cloudinary 這類三方資產託管服務才能把圖片帶入文章中,但現在只要把圖片放到 Git 儲存庫中就能直接使用,對網頁東東這個單純由開發者來經營的網站來說是優雅精簡的流程(GitHub 就像是我的 Git-Based CMS)。
就算你的網站不是由開發者經營,仍可以透過 Git LFS 來管理大型檔案,像是些許的 Open Graph 圖片、字體檔案……把資源都集中管理在同個地方也是非常方便。
使用 Git LFS 須注意的事項
Git LFS 服務不是無限免費的
可以查看 bill for Git Large File Storage 以及 Viewing your Git Large File Storage usage 或提供 LFS 的廠商服務價格細節了解更多。
就網頁東東整個部落格為例,大大小小的影片、圖片、字體……至今共 251
個 LFS 檔案也才使用了 43.2 MB
的空間額度,當然也是因為有多事先留意並壓縮這些檔案,但必須說每個月 1 GB 免費額度已經足夠很多情境免費用到爛了。
CI/CD 流程上須留意
因為 Git LFS 會將大型檔案儲存在額外的伺服器上,所以在 CI/CD 流程上會需要額外的設定來下載這些 LFS 檔案,這點在我的部落格中也有實踐,並且還有額外設置快取來避免重複的取得相同的 LFS 檔案。
總結
會寫這篇文章也是因為先前團隊並沒有導入 Git LFS 的習慣,一些大型的網頁資產仍是直接儲存在 Git 儲存庫當中,隨著架構更新以及導入 Monorepo 的架構,可以預期專案大小會直線上升,也促使我希望能夠在初期就導入 Git LFS 來預防 Git 儲存庫炸裂的問題。
我認為這項技術特別適合在某些領域中使用,像是:前端或遊戲開發這類需要與大量二進制檔案互動的領域。