2025/04/30

用一行指令搞定 Git 歷史中的大檔案:git lfs migrate import

用一行指令搞定 Git 歷史中的大檔案:git lfs migrate import

如果你曾經在推送 Git 專案到 GitHub 時遇到以下錯誤訊息:

remote: error: File opencv2.framework/Versions/A/opencv2 is 236.31 MB; this exceeds GitHub's file size limit remote: error: GH001: Large files detected. You may want to try Git Large File Storage

那麼你就遇到 GitHub 強制限制:單一檔案不可超過 100MB。而這個限制,不只是針對目前版本的檔案,就算該檔案只曾出現在 Git 歷史中一次,也會導致整個 Push 被拒絕。

常見的錯誤誤解


  • ❌ 單純加到 .gitignore 是無效的,因為 Git 歷史已經記錄過
  • ❌ 使用 git lfs track 只能對未來新 commit 有效,無法 retroactively 處理歷史
  • ✅ 正確解法:使用 git lfs migrate import 將歷史中的大檔搬到 Git LFS

一行指令搞定歷史大檔案

假設你遇到的問題包括多個模型檔(.mlmodel.onnx),以及像 opencv2 這樣無副檔名的大型 Framework 檔案,以下這一行指令就能完整處理:

git lfs migrate import --include="*.mlmodel,*.mlmodelc,*.onnx,DetectionKit-Shared/MLModel/**,opencv2.framework/Versions/A/opencv2" --everything

這會:

  • 掃描整個 Git 歷史(所有 branch、所有 tag)
  • 將指定副檔名與路徑的檔案轉為 Git LFS 專屬格式
  • 自動產生 .gitattributes 設定檔

接著強制推送乾淨的版本

因為這會更動 commit ID(但不會改變 branch 結構),你需要重新設定遠端並強制推送至 GitHub:


git remote remove origin || true
git remote add origin git@github.com:your-org/your-repo.git
git push origin --mirror --force
  

注意: 所有團隊成員都需要重新 clone,此為不可避免的副作用。

如何預防未來再次出錯?

建議你在專案初始化時就建立正確的 LFS 設定:


git lfs track "*.mlmodel"
git lfs track "*.framework"
git add .gitattributes
git commit -m "Setup Git LFS tracking for large files"
  

結語

當面對 GitHub 嚴格的大檔案限制,git lfs migrate import 是目前最有效、最乾淨的解法。它能讓你保留完整 Git Tree 結構的情況下,從歷史中安全搬移大檔到 Git LFS。

如果你不想重寫 Git 歷史、卻又必須處理大型模型檔、Framework、甚至是沒有副檔名的裸檔案,這一行指令就是你的最佳解方。


📌 延伸閱讀:Git Large File Storage 官方網站