解決 git out of memory 的問題


之前 Heresy 有整理過一篇《使用 TortoiseGit 將 SVN 轉移到 Git 的紀錄》,試著去把 SVN 的程式轉移到 GIT 的環境;不過當時因為還有其他事,所以只是先測試、並沒有完全完成。而最近,算是有真的需求、需要做轉移的工作了,所以又把他撿回來、試著做了一下。

結果,感覺似乎是因為 SVN 的東西又變多很多了,結果現在用 Git 取得 SVN 的資料的時候,跑到一半就會出現錯誤訊息了…下面就是錯誤訊息:

Auto packing the repository for optimum performance. You may also run "git gc"
manually. See "git help gc" for more information.

warning: suboptimal pack - out of memory

fatal: Out of memory, malloc failed (tried to allocate 98849273 bytes)

error: failed to run repack

gc --auto: command returned error: 255

git did not exit cleanly (exit code 1) (13256532 ms @ 2015/--/-- --:--:--)

這個錯誤,基本上應該就是在執行「git gc」的時候,記憶體不夠他去配置,導致觸發了記憶體不足的錯誤。

不過雖然說是記憶體不足…但是 Heresy 工作的電腦可是有 64GB 的記憶體、都還沒用啊~而且真的認真去看,其實 Git 的程式用的記憶體量,也沒有爆炸性地增加啊?再加上錯誤訊息中,他試著去配置的記憶體也不過 100MB 不到,結果就說記憶體不足?所以,其實 Heresy 也搞不清楚問題在哪?

後來找了一下,網路上也有人有碰到類似的問題,例如《Git on Windows, "Out of memory – malloc failed"》這篇討論的問題,基本上就和 Heresy 碰到的問題是一樣的。

根據文章的解法看來,這個問題應該是 Git 本身設定檔的記憶體限制需要修改才行。他的建議,是在設定檔裡面加上下面的設定:

[core]
  packedGitLimit = 128m
  packedGitWindowSize = 128m

[pack]
  deltaCacheSize = 128m
  packSizeLimit = 128m
  windowMemory = 128m

而如果是在 Windows 下安裝 TortoiseGit 的話,他預設安裝的 Git 設定檔應該會是「C:\Program Files (x86)\Git\etc\gitconfig」這個檔案。

不過…Heresy 看到這才發現,雖然 Heresy 裝的 TortoiseGit 是 64bit 的,但是他預設去裝的 Windows 版 Git 卻是 32 位元的(而且還是 1.9.5、2014 的版本…)!?這難怪在記憶體還很空的時候,就會喊記憶體不足了啊…

而實際上,Heresy 照他的建議下去改,還是會有一樣的問題。後來又研究了一下,這才發現,他的記憶體使用量和 CPU 的核心數目也有關係;他預設會用最多的執行序下去跑,而這邊設定的記憶體似乎是每個執行序都的上限,所以當 CPU 核心多的時候,整體記憶體用的自然也比較兇了…

所以,如果要繼續用 32 位元的 Git 的話,要不就是得再把記憶體條小,不然就是要限制執行序的數量、讓他跑慢一點了… orz


最後呢,Heresy 是發現,現在 http://git-scm.com/ 上最新版已經是 2.6.4,而且還有提供 64 位元版!所以,其實只要把本來的 git-scm 移除、然後安裝最新的 64 位元版本,基本上就沒問題了…

不過話說,TortoiseGit 自己有更新都會跳出來通知,結果核心的 GIT 程式居然都沒去檢查版本…這點感覺有點不直覺啊… @@

總之,如果是很在 Windows 早就把 Git 裝起來的人,記得手動更新一下 git-scm 吧…

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.