一、簡介
Git LFS(Git Large File Storage)是由 GitHub 開發的一款 Git 擴展工具,旨在幫助開發者更高效地管理倉庫中的大文件。傳統 Git 會將文件的每個版本完整存儲在倉庫歷史中,導致大文件(如音頻、視頻、數據集、二進制文件等)快速膨脹倉庫體積,影響克隆和推送效率。Git LFS 通過以下機制解決這一問題:
核心原理
- 指針替換:在提交時,將大文件替換為輕量級的文本指針(Pointer File),僅幾 KB 大小,包含原文件的元信息(如哈希值、存儲路徑)。
- 遠程存儲:大文件實際內容被存儲在 Git LFS 服務器(如 GitHub、GitLab 提供的服務,或自建服務器),與代碼倉庫分離。
- 按需下載:克隆或切換分支時,Git LFS 會根據指針文件從遠程服務器下載當前需要的大文件版本,而非全部歷史版本。
工作流程
- 安裝:先安裝 Git LFS 客戶端(官網下載),并在倉庫中初始化:
bash
git lfs install
- 跟蹤文件:指定需要使用 LFS 管理的文件類型或路徑(支持通配符):
bash
此操作會生成?git lfs track "*.mp4" # 跟蹤所有 MP4 文件 git lfs track "data/*" # 跟蹤 data 目錄下的所有文件
.gitattributes
?文件并自動提交,記錄跟蹤規則。 - 正常提交:添加、提交和推送文件時,Git LFS 會自動處理大文件:
bash
推送時,大文件會上傳至 LFS 服務器,代碼倉庫僅包含指針。git add video.mp4 git commit -m "添加視頻文件" git push origin main
- 克隆倉庫:使用?
git clone
?時,LFS 文件會自動下載:bash
若只需代碼而不下載大文件,可使用:git clone https://example.com/repo.git
bash
后續按需下載指定文件:git lfs clone --skip-smudge https://example.com/repo.git
bash
git lfs pull --include="video.mp4"
主要優勢
- 倉庫體積顯著減小:避免大文件占用過多空間,提升克隆速度。
- 版本控制更高效:僅需管理輕量級指針,歷史記錄更清晰。
- 協作友好:團隊成員可選擇性下載需要的大文件,節省帶寬。
- 兼容性強:與現有 Git 工作流程無縫集成,無需改變使用習慣。
注意事項
- 存儲成本:部分托管平臺(如 GitHub)對 LFS 存儲和帶寬有限額,超出需付費。
- 依賴外部服務:需確保 LFS 服務器可用,否則可能影響文件訪問。
- 歷史清理復雜:若誤提交大文件到普通 Git 歷史,需使用?
git filter-repo
?等工具清理。
Git LFS 適合需要在 Git 倉庫中管理大文件的場景,尤其在音視頻制作、機器學習(數據集)、游戲開發(資源文件)等領域應用廣泛。
二、Git LFS的使用過程
1.創建文件夾,使用git init?
# 在當前目錄初始化一個新的 Git 倉庫 git init
2.在該倉庫下安裝Git LFS
15155@MM MINGW64 /e/Git_Projects/MDK (main)
$ git lfs install
Updated Git hooks.
Git LFS initialized.
驗證
$ git lfs version
git-lfs/3.5.1 (GitHub; windows amd64; go 1.21.7; git e237bb3a)
3.配置跟蹤規則
在倉庫中指定哪些文件需要使用 LFS 管理,支持通配符(如?*.mp4
、data/*
)。
方式一:命令行直接跟蹤
bash
git lfs track "*.mp4" # 跟蹤所有 MP4 文件
git lfs track "data/*" # 跟蹤 data 目錄下的所有文件
git lfs track "model.h5" # 跟蹤特定文件
執行后,Git LFS 會自動創建或更新?.gitattributes
?文件(需提交該文件)。
$ git lfs track "*.zip"
Tracking "*.zip"
產生文件
?方式二:手動編輯?.gitattributes
直接在倉庫根目錄創建或編輯?.gitattributes
?文件,添加類似以下內容:
plaintext
*.mp4 filter=lfs diff=lfs merge=lfs -text
data/* filter=lfs diff=lfs merge=lfs -text
4.提交Git LFS配置文件,目標大文件和推送到運程的目標大文件
添加、提交和推送文件的操作與普通 Git 流程一致,但大文件會自動上傳到 LFS 服務器:
bash
git add .gitattributes # 提交跟蹤規則
git add video.mp4 # 添加大文件(實際只提交指針)
git commit -m "添加視頻文件"
git push origin main # 推送時,大文件會上傳到 LFS 服務器
(1)提交配置
$ git add .gitattributes
(2)查看大文件
$ ls -al
total 813758
drwxr-xr-x 1 28970 197609 0 Jul 27 10:24 ./
drwxr-xr-x 1 28970 197609 0 Jul 27 09:55 ../
drwxr-xr-x 1 28970 197609 0 Jul 27 10:27 .git/
-rw-r--r-- 1 28970 197609 43 Jul 27 10:24 .gitattributes
-rw-r--r-- 1 28970 197609 833276817 Jul 16 22:16 MDK528.zip
-rw-r--r-- 1 28970 197609 39 Jul 27 09:45 README.md
(3)暫存目標大文件
$ git add MDK528.zip
(4)提交到本地
$ git commit -m "Firstly,commit a big MDK_Setup_package."
[main 39e1935] Firstly,commit a big MDK_Setup_package.2 files changed, 4 insertions(+)create mode 100644 .gitattributescreate mode 100644 MDK528.zip
(5)推送至遠程
$ git push origin main
Uploading LFS objects: 100% (1/1), 833 MB | 3.6 MB/s, done.
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 20 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 498 bytes | 249.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
To github.com:Molesidy/MDK.git58bc491..39e1935 main -> main
5.成功提交并上傳大文件
注:普通git不能傳輸超過100MB的文件,而git lfs在github上最大支持2GB;
普通的免費 GitHub 倉庫建議最大存放 1GB 的文件:
GitHub 雖未對免費倉庫設置嚴格的硬性容量上限,但建議將倉庫大小保持在 1GB 以內,理想情況是小于 5GB。若超過該大小,可能會收到 GitHub 支持團隊要求減小倉庫大小的郵件。此外,免費賬戶單個文件不能超過 100MB,若文件大于 50MB 會收到警告,若通過瀏覽器上傳文件,則不得大于 25MB。
三、補充說明1
Git LFS 的文件大小限制取決于具體的存儲提供商和客戶端配置,而非 Git LFS 本身。以下是常見場景的限制說明:
1. 不同平臺的文件大小限制
平臺 | 免費版限制 | 付費版限制 |
---|---|---|
GitHub | 單個文件 ≤ 2GB | 單個文件 ≤ 5GB(需聯系支持) |
GitLab | 單個文件 ≤ 10GB(取決于實例配置) | 企業版可提升限制 |
Bitbucket | 單個文件 ≤ 2GB | 單個文件 ≤ 5GB(需聯系支持) |
AWS CodeCommit | 無明確限制(受 S3 存儲桶限制) | 無明確限制 |
自建服務器 | 取決于服務器配置(如 Nginx/Apache 限制) | 自定義配置 |
- 注意:即使平臺支持大文件,上傳速度也可能受網絡和服務器性能影響。
2. 客戶端配置限制
Git LFS 客戶端默認沒有嚴格的文件大小上限,但可能受以下因素影響:
- HTTP 請求大小限制:如果使用 HTTP 協議傳輸,服務器(如 Nginx、Apache)可能限制最大請求體大小。例如:
bash
# Nginx 配置示例(需修改 nginx.conf) client_max_body_size 10G;
- 內存和磁盤空間:上傳 / 下載大文件時,客戶端需要足夠的臨時空間緩存數據。
3. 突破限制的方法
- 使用專業存儲服務:對于超大文件(如數十 GB),可考慮將文件存儲在云存儲(如 S3、Google Cloud Storage),僅在 Git 中記錄下載鏈接。
- 分塊處理:將大文件分割為多個小文件(如使用?
split
?命令),分別管理。 - 聯系平臺支持:企業版用戶可聯系 GitHub/GitLab 等平臺提升限制。
4. 最佳實踐
- 避免超大型文件:盡量將單個文件控制在 1GB 以內,過大的文件會顯著降低協作效率。
- 使用?
.gitattributes
?嚴格過濾:僅對必要的大文件使用 LFS,避免意外提交不需要的大文件。 - 定期清理歷史:使用?
git lfs prune
?清理不再需要的本地 LFS 文件。
總結
Git LFS 的實際文件大小限制因平臺而異,免費版通常支持 2GB 以內,付費版或自建服務器可擴展到更大。在使用前,建議查看對應平臺的文檔或聯系技術支持確認具體限制。
四、補充說明2
對于免費 GitHub 用戶,單個倉庫內的 Git LFS 文件最大支持 2GB,這一結論是正確的。以下是具體細節和限制說明:
1. 單個文件大小限制:2GB(免費版明確支持)
根據 GitHub 官方文檔,免費用戶的 Git LFS 文件大小限制為:
- 單個文件上限:2GB(付費版如 GitHub Team 為 4GB,GitHub Enterprise Cloud 為 5GB)。
- 超出處理:若上傳超過 2GB 的文件,Git LFS 會直接拒絕并報錯。
例如,用戶上傳一個 2.1GB 的視頻文件時,會收到類似以下的錯誤提示:
bash
error: The file "large_video.mp4" is 2.1 GB; this exceeds GitHub's file size limit of 2.0 GB for Git LFS files.
2. 倉庫總存儲量限制:所有倉庫共享 1GB
盡管單個文件支持 2GB,但免費用戶的所有倉庫的 LFS 文件總存儲量被限制為 1GB。例如:
- 若在多個倉庫中分別上傳 2 個 1GB 的 LFS 文件,總存儲量將達到 2GB,超出免費配額,導致后續上傳失敗。
- 需通過 GitHub 賬戶設置中的Billing and plans頁面查看實時用量。
3. 帶寬配額:每月 1GB(所有倉庫共享)
免費用戶的 LFS 文件下載和上傳帶寬每月總計 1GB。例如:
- 若一個 2GB 的 LFS 文件被下載 5 次,總帶寬消耗為 10GB(遠超免費配額),此時文件將無法繼續下載,需升級付費計劃。
4. 常見誤區與注意事項
(1)倉庫總大小與 LFS 存儲的區別
- 倉庫總大小:GitHub 建議免費倉庫總大小控制在 1GB 以內(含普通文件和 LFS 指針文件),但這是軟性建議,非硬性限制。
- LFS 存儲量:僅計算實際存儲在 GitHub LFS 服務器上的大文件內容,不包含倉庫中的普通文件和指針文件。
(2)LFS 指針文件不占用存儲配額
Git LFS 在倉庫中存儲的是輕量級指針文件(約 1KB),這些文件不計入 1GB 的 LFS 存儲配額。例如:
- 即使倉庫中有 1000 個 LFS 指針文件,它們的總大小仍可忽略不計。
(3)歷史文件清理的重要性
- 未引用的 LFS 文件:即使文件被刪除或從倉庫歷史中移除,其內容仍可能保留在 LFS 存儲中,繼續占用配額。
- 清理方法:使用?
git lfs prune
?命令清理本地未引用的 LFS 文件,或通過 GitHub API 刪除遠程未引用的對象。
5. 突破限制的可行方案
(1)拆分大文件
- 將單個 2GB 以上的文件拆分為多個 2GB 以內的片段(如使用?
split
?命令),分別上傳。 - 示例:
bash
split -b 2G large_file.iso large_file_part_
(2)混合使用 LFS 和外部存儲
- 對超過 2GB 的文件,將其存儲在云存儲(如 AWS S3、Google Cloud Storage),僅在 Git 中記錄下載鏈接。
- 示例:
markdown
# 下載大文件的說明 1. 訪問 [S3鏈接](https://example-bucket.s3.amazonaws.com/large_model.pth) 2. 將文件放置在 `models/` 目錄下
(3)升級付費計劃
- GitHub Team($4 / 用戶 / 月):提供 50GB 存儲 + 50GB / 月帶寬,單個文件支持 4GB。
- GitHub Enterprise Cloud:支持 5GB 單個文件,存儲和帶寬配額更高。
總結
免費 GitHub 用戶的單個倉庫內的 Git LFS 文件最大支持 2GB,但需注意以下全局限制:
- 所有倉庫的 LFS 文件總存儲量:1GB。
- 每月帶寬配額:1GB。
- 倉庫總大小建議:控制在 1GB 以內(含普通文件和指針文件)。
若需頻繁處理大文件,建議結合外部存儲或升級付費計劃,以避免因配額不足影響協作。