最完整 如何解決 .git 檔案過大, git clone 產生 Swap Out of memory 問題

.git 檔案過大,會需要依照當時專案的環境做不同處理,這裡將各種可能的狀況,提供解決方案。

當 .git 檔案過大,伺服器記憶體不足時,會出現以下錯誤:

swap Out of memory, malloc failed (tried to allocate xxxxxxxxxx bytes)

通常會發生這問題,原因都在於這個 git repository 已經使用一定時間,提交次數非常多,導致 .git 檔案過大

例如,.git 檔案就佔據 2Gb

遇到這狀況時,可能遇到一些問題,例如:主機環境是否能變動,commit 資訊是否要保留等

以下針對各種問題,提供對應的解決方法:

一、保留所有 commit 紀錄

當 git commit 記錄必須保留,這種情況有兩種解決方法:

1.可變更主機環境的情況下,升級記憶體或擴充 swap

如果能夠變更主機的用量及可進行擴充,可以考慮這個方法。

在不變動任何 repository 且 .git 紀錄必須完全保留

可直接對主機記憶體進行升級,或者針對 swap 磁碟進行擴充,解決記憶體不足的問題

如果主機環境無法變更,則可以考慮後面的方法

2.重新建立新 repository

建立新的 repository

在記憶體充足的主機將原有專案 clone 之後,將 .git 刪除

並且將專案重新 push 到新的 repository

rm -rf .git
git init
git add .
git comman -m"init project"
git remote add origin <新repository 位置>
git push -u origin master

3.在本地指定 clone depth

保留遠端 repository commit 紀錄,

在本地,透過指定取得近 n 次的 commit 方式,來減少 .git 量

例如,git clone 且僅需取得最近 1 次的 commmit 紀錄

git clone --depth 1 <repository 位置>

如果使用 submodule 則使用:

git submodulte update --init --depth 1

二、不保留 commit 紀錄

(在前面提到的2, 3 點,也適用於解決.git檔案過大問題)

解決 .git 檔案過大的問題,若可以不保留過去 commit 紀錄的情況,則可以考慮以下方式:

產生錯誤的原因,其中包括 Clone 時, .git 檔案過大

解決 .git 檔案過大的處理方式:

1.刪除無用分枝

git branch -D <branch name>

2.刪除無用 tag

git tag -d <tag name>

3.清除本地 repository

git gc --prune=now