2021年2月6日 星期六

[Git] git pack loose object out of memory

markdown 最近有個專案在用 git-gui 時一直跳出來說 loose object 太多要我壓縮,但每次按下 OK 讓它壓縮後,都跳出 out of memory 的訊息壓縮失敗。於是每次用 git-gui 時這個訊息就會跳出來一次實在有點煩,再加上有時會遇到怪怪的問題不知道跟 loose object 很多有沒有關係,於是就花了一點時間查一下看怎麼解決壓縮 loose object 時 out of memory 的問題。 其實 git 有 command `git gc --auto` 可以壓 loose object,不過預設是 loose object 超過 7000 時才會動作,git-gui 顯示提示訊息時我的專案卻只有 4 千多 loose object,看來是 git-gui 有自己的設定,我實際跑了 `git gc --auto` 也確實沒有作用。 如果不管 loose object 個數就是要壓的話,使用 `git gc` 就好了,不過我用了以後一樣會 fail,顯示 mmap invalid argument,雖然錯誤訊息沒有明確指出是 out of memory,但開工作管理員觀察,在壓縮時確實把記憶體吃滿了,因此應該還是因為記憶體不足。 在網上查了一下,發現在做壓縮時,git 預設會照你的 CPU 核心數開啟同等數量的 threads 來工作,我的電腦是 4 核心,git 的 log 也確實顯示它開了 4 個 threads。 在 [stackoverflow](https://stackoverflow.com/questions/3095737/is-there-a-way-to-limit-the-amount-of-memory-that-git-gc-uses) 看到有個解法是改 git config 來降低記憶體使用率。我沒有像連結裡講的連 windowMemory 跟 packSizeLimit 都改掉,只有改 thread,因為我覺得主要就是因為開 4 個 thread 才吃那麼多記憶體,改了後果然壓縮就成功了。 其實這個案子是接手來的,前人把很多不是程式碼的大檔案都通通塞進了 code server 裡,猜測是因為這樣才造成壓縮時記憶體吃這麼多,不過只開一個 thread,雖然時間比較久,但還是可以壓縮成功。 --- * [Is there a way to limit the amount of memory that “git gc” uses?](https://stackoverflow.com/questions/3095737/is-there-a-way-to-limit-the-amount-of-memory-that-git-gc-uses)