將 Git 專案的大小從 1.3 GB 成功縮減,並將清理後的歷史記錄同步到遠端伺服器。


🎯 專案目標

將 Git 專案的大小從 1.3 GB 成功縮減,並將清理後的歷史記錄同步到遠端伺服器。

🚨 問題發現與檢查流程

階段動作發現/結論
起始問題git clone 後發現專案大小高達 1.4 GB,遠超程式碼應有的大小。初步診斷: 專案體積異常巨大,懷疑 Git 歷史記錄有問題。
檢查大小執行 du -sh .確認專案總體積為 1.3G。
定位根源執行 du -h -d 1 . 檢查子目錄大小。發現: 工作目錄下的檔案(如 ./compiler)極小,推斷 .git 資料夾(歷史記錄)佔了絕大部分空間。
追溯歷史透過檢查提交紀錄,證實了猜測。問題確認: 曾在早期提交 (upload project Commit) 中,誤將大型檔案加入版本控制(即「曾經上傳過很大的檔案」)。
鎖定元兇檢查該 Commit 的內容。目標檔案: archived/codehelper.tar 和 archived/gcc-api.tar。

結論: 必須透過重寫歷史記錄,將這兩個檔案從所有版本中永久刪除,才能達到瘦身的目的。

🛠️ 預期處理方法:重寫歷史記錄

  • 選用工具: BFG Repo-Cleaner (高效且安全地重寫 Git 歷史)。
  • 操作策略: 在專案的鏡像克隆上進行操作,避免破壞當前的工作目錄。

⚙️ 處理過程與指令紀錄

步驟說明執行指令 (路徑已識別化)
前提準備安裝 Java 和 BFG確保 Java 環境和 bfg-1.15.0.jar 已準備好。
1. 鏡像克隆建立鏡像副本並進入操作目錄。cd /Users/.../Repogit clone --mirror codehelper codehelper-cleaner.gitcd codehelper-cleaner.git
2. 執行 BFG使用 BFG 從所有歷史記錄中,刪除兩個大 .tar 檔案。 (注意修正指令格式)java -jar [BFG 路徑] --delete-files "{codehelper.tar,gcc-api.tar}" .
3. 執行 GC清理 Git 殘留日誌,並強制執行垃圾回收,釋放磁碟空間git reflog expire --expire=now --allgit gc --prune=now --aggressive
4. 設定遠端修正錯誤: 移除鏡像上指向本地的遠端設定,改設為真正的學校伺服器 URL。git remote rm origingit remote add origin https://.../codehelper.git
5. 強制推送將清理後的歷史記錄強制推送到遠端伺服器git push --force --allgit push --force --tags
6. 本地清理刪除舊的專案和鏡像,重新克隆乾淨的版本。cd ..rm -rf codehelperrm -rf codehelper-cleaner.gitgit clone https://.../codehelper.git codehelper

✅ 處理總結

  • 最終結果: 成功從 Git 歷史記錄中永久移除了兩個大型 .tar 檔案,並在遠端伺服器上覆蓋了舊的歷史記錄。
  • 效益: 新的 clone 大小已大幅縮減(預期降至數 MB),解決了 Git 操作緩慢的問題。
  • 下一步: 必須確保所有協作者刪除他們本地的舊副本,並從遠端伺服器重新克隆新、瘦身後的專案。